CF1455D Sequence and Swaps 题解

因为要求 $a_i>x$ 才可以交换,而序列要求 $a_{jin[i+1,n]}geq a_i$ ,所以如果有 $a_i>x$ 而不交换,那么后面都不能交换了。因此可以直接从前往后扫,遇到 $a_i>x$ 就交换。

但是显然有序的数列是不用处理的,那么我们只需要处理到最后一个乱序的位置即可。可以先遍历一遍序列,找到最后一个乱序的位置,然后就按上面的方法处理,到那个位置就停止。然后再遍历一遍判断是否有序即可,此时若仍然无序则无解。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=700;
int T,n,x,ans,b;
int a[N];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&x);b=ans=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]<a[i-1])
                b=i;//最后一个乱序的位置
        }
        if(b)
        {
            for(int i=1;i<=b;i++)
                if(x<a[i])
                    swap(x,a[i]),ans++;//遍历 [1,b] 并处理
            for(int i=1;i<=n;i++)
                if(a[i]<a[i-1])
                    b=0;//仍然乱序
            printf(!b?"-1
":"%d
",ans);
        }
        else//有序
            puts("0");
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/TEoS/p/14074880.html