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;
}
View Code

 

posted @ 2021-04-06 12:45  UpMing  阅读(193)  评论(0编辑  收藏  举报