一定注意数组范围,不然会被Hack。 a,s数组可以只开1010。而数组b一定是要开2010,开1010是不够的,会被Hack。我这方便起见,全部开为2010。 这就一个找规律的题。先找规律,再随机分配。
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 2010; int a[maxn]; int b[maxn]; int s[maxn]; int n; int ans; int main(){ int t; cin >> t; while(t--){ memset(s,0,sizeof(s)); cin >> n; for(int i = 1;i <= n;i++){ cin >> a[i]; s[a[i]]++; } ans = 0; while(1){ int p = -1; for(int i = 0;i <= n;i++){ if(!s[i]){ p = i; break; } } //cout << p << endl; if(p != 0){ b[ans++] = p; s[a[p]]--; a[p] = p; s[p]++; } else { int flag = 0; for(int i = 1;i <= n;i++){ if(a[i] != i){ flag = 1; b[ans++] = i; s[a[i]]--; a[i] = 0; s[p]++; break; } } if(!flag) break; } /*for(int i = 0;i <= n;i++){ cout << s[i] << " "; } cout << endl;*/ } cout << ans << endl; for(int i = 0;i<ans;i++){ if(i) cout << " "; cout << b[i]; } cout << endl; /*for(int i = 0;i<n;i++){ if(i) cout << " "; cout << a[i]; } cout << endl;*/ } return 0; }