15个选择题,每个2分,3个程序题,每个30.
分析题目可以发现原始序列和之后的序列有一个对应关系。 比如队列的第二个数是第一个被输出的,所以输出是 1 2 ... n的话,对应的第二个数就是1 依次内推。我们可以从之后的序列出发进行同样的操作然后做个对应关系的映射还原回原始的序列
1 #include "iostream" 2 #include "queue" 3 #define N 100005 4 5 using namespace std; 6 7 int n, a[N], b[N]; 8 9 int main() { 10 int t; 11 cin >> t; 12 13 while (t--) { 14 cin >> n; 15 queue<int> q; 16 for (int i = 1; i <= n; i++) 17 q.push(i); 18 19 int cnt = 0; 20 21 while (!q.empty()) { 22 int x = q.front(); 23 q.pop(); 24 q.push(x); 25 x = q.front(); 26 a[++cnt] = x; 27 q.pop(); 28 } 29 30 for (int i = 1; i <= n; i++) 31 b[a[i]] = i; 32 33 for (int i = 1; i < n; i++) 34 cout << b[i] << " "; 35 cout << b[n]; 36 cout << endl; 37 } 38 return 0; 39 }
再开一个数组,模拟下,暴力就过了:
1 #include "iostream" 2 #define MAX 201 3 typedef long long LL; 4 5 using namespace std; 6 7 int n, k; 8 LL a[MAX], b[MAX]; 9 void solve(LL *a) 10 { 11 for (int i = 1; i <= 2*n; i++) 12 { 13 if (i <= n) 14 { 15 b[2 * i - 1] = a[i]; 16 } 17 else 18 b[2 * (i - n)] = a[i]; 19 } 20 for (int i = 1; i <= 2 * n; i++) 21 { 22 a[i]=b[i]; 23 } 24 } 25 26 int main() 27 { 28 int t; 29 30 cin >> t; 31 while (t--) 32 { 33 cin >> n >> k; 34 for (int i = 1; i <= 2 * n; i++) 35 cin >> a[i]; 36 37 while (k) 38 { 39 solve(a); 40 k--; 41 } 42 43 for (int i = 1; i < 2 * n; i++) 44 { 45 cout << a[i] << " "; 46 }cout<<a[2*n]; 47 cout << endl; 48 } 49 }