专栏文章

题解:AT_judge_update_202004_c Numbering Blocks

AT_judge_update_202004_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min922rw
此快照首次捕获于
2025/12/01 22:33
3 个月前
此快照最后确认于
2025/12/01 22:33
3 个月前
查看原文
Warning
这篇文章是 C++ 的福利,P 党请跳过。
看到题目,嗯……这题怎么做呢?应该是 O(n3)\mathcal{O}(n^3) 的 dp 吧,让我们看看数据范围:What!N9N \le 9STL 启动!
next_permutation 大法好!
直接枚举每个填数字的方法然后再判断是否合法就可以了。
时间复杂度:O(N×N!)\mathcal{O}(N\times N!),轻松通过。
CodeCPP
#include <bits/stdc++.h>

using namespace std;

long long a1, a2, a3, Ans, a[100];

bool pd(){
	for(int i = 1; i <= a1; ++ i){
		if(a[i] <= a[i - 1]) return false;
	}
	
	for(int i = a1 + 1; i <= a1 + a2; ++ i){
		if(a[i] <= a[i - 1]) return false;
		if(a[i] <= a[i - a1]) return false;
	}
	
	for(int i = a1 + a2 + 1; i <= a1 + a2 + a3; ++ i){
		if(a[i] <= a[i - 1]) return false;
		if(a[i] <= a[i - a1 - a2]) return false;
	}
	
	return true;
}

int main(){
	cin >> a1 >> a2 >> a3;
	
	for(int i = 1; i <= a1 + a2 + a3; ++ i){
		a[i] = i;
	}
	
	do{
		if(pd()){
			Ans ++;
		}
	}while(next_permutation(a + 1, a + a1 + a2 + a3 + 1));
	
	cout << Ans;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...