只有1 3过了,2 dfs超时了,其他全wa

P1088 [NOIP2004 普及组] 火星人

大佬帮帮忙!或者告诉我后面的测试点!卡在2出不去了
by Camelliail @ 2024-03-04 15:21:36


1我觉得你的有点麻烦,就是它这题考的其实就是全排列题,如果你做了全排列再做这题思绪可能就会好一点。题目的计数顺序是按照全排列的顺序的,一般简单的全排列爆搜就能打。 然后这题我们可以让全排列从给定的外星人手指的排列顺序开始,往后每进行一次排列时,计数++,直到加到最终要求的数为止 上代码 ``` #include<iostream> #include<algorithm> using namespace std; int n;//从1-n选r个数 int t; int a[10010]; int b[10010]; int ans = 0; void DFS(int i) { if (ans > t) return; if (i>n) { //放满了 ans++; if(ans>t) for (int i = 1; i <= n; i++) { cout << a[i]; if (i != n) cout << ' '; else cout << endl; } return; } for (int t = 1; t <= n; t++) { if (ans == 0) { t = a[i]; b[t] = 1; DFS(i + 1); b[t] = false; } else if (b[t] == false) { a[i] = t; b[t] = 1; DFS(i + 1); b[t] = false; } } } int main() { cin >> n; cin >> t; for (int i = 1; i <= n; i++) cin >> a[i];//先录入一个排列 DFS(1); } ``````
by sml259 @ 2024-03-25 11:04:07


@[sml259](/user/1281336) 好的呢 谢谢!当时还不熟练全排列,现在已经会了!
by Camelliail @ 2024-04-12 23:01:58


|