旋转阵列(Larray hackerrank)

时间:2016-03-26 17:11:54

标签: c arrays algorithm

我无法获得problem解决方案背后的逻辑。如果有人能解释我的工作,我将非常感激。

解决方案:

#include <bits/stdc++.h>
using namespace std;
const int N=1509;
int n;
int a[N];

void input(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
}

void sol(){
    int K=1;
    for (int i=1;i<=n;i++)
    for (int j=i+1;j<=n;j++)
        K^=(a[i]>a[j]);
    if (K) printf("YES\n");
    else printf("NO\n");
}

int main() {
    int test;
    scanf("%d",&test);
    while (test--){
        input();
        sol();
        }
    return 0;
}

我无法了解每个排列后的值,&#39; k&#39;到底是确定答案(即是否可以按排序顺序排列)?

1 个答案:

答案 0 :(得分:2)

当您旋转一个块时,您可以将反转次数更改为+/- 2或0(如果您不信任我,则将其在纸上进行处理)。因此,如果数组中的反转次数为奇数,则无法使用给定的操作对其进行排序。您将最终使用除了2个元素之外的所有元素进行排序(1个反转),并且您无法使用给定的操作来修复它。

代码所做的是每次看到反转时通过自身进行切换来检查反转的数量是否为奇数。如果计算倒数并检查inversions % 2 == 0

,则可以得到相同的结果