Codeforces1510K - King's Task(思维)
题目大意:
给你2*n个数,给你两种操作
op1:交换所有的a[i]和a[i+1] , i 为奇数
op2:交换所有的a[i]和a[i+n],i<=n
思路:
如果我们连续对一个操作连续操作两次,序列是不变的
所以op1和op2要交替操作
至于先操作谁,可以都试下,得到的ans1和ans2取一下最小值,然后注意无解的情况
下面参考自官方题解:
如果n是偶数,交替四次就回到的初始序列
1->2->n+2->n+1->1
如果n是奇数,交替操作2*n次就回到的初始序列
1->2 ->n+2->n+3 ->3 ->n+1->1 (这里我假设n==3)
所以超过一定的循环次数就是无解
CODE:
int n, m, a[maxn], b[maxn]; int ok(int *c) { int flag = 1; for(int i = 1 ; i <= n * 2 ; i++) if(c[i] - c[i - 1] != 1) flag = 0; return flag; } int main() { n = read(), m = n * 2; rep(i, 1, m) b[i] = a[i] = read(); if(ok(a)) { out(0); return 0; } int ans1 = inf; int ans2 = inf; for(int i = 1 ; i <= m ; i++) { if(i % 2)rep(j, 1, n) swap(a[j], a[j + n]); else for(int j = 1 ; j <= m; j += 2) swap(a[j], a[j + 1]); if(ok(a)) ans1 = min(ans1, i); } for(int i = 1 ; i <= m ; i++) { if(i % 2 == 0)rep(j, 1, n) swap(b[j], b[j + n]); else for(int j = 1 ; j <= m; j += 2) swap(b[j], b[j + 1]); if(ok(b)) ans2 = min(ans2, i); } int ans = min(ans1, ans2); if(ans == inf) ans = -1; out(ans); return 0; }