CF1455D Solution

题目链接

题解

可以发现,如果\(a_i>x\)且不对\(a_i\)执行操作,\(a_{i+1}-a_n\)便无法执行操作。这个性质可以保证下述方法的正确性与最优性:

找到第一个满足\(a_{pos}\)之后序列单调不降的\(pos\),依次对所有\(1\le i\le pos\)\(a_i>x\)的元素将\(x\)\(a_i\)互换。因为\(x\)在操作过程中始终是单调递增的,因此所有进行过操作的元素一定满足单调不降。如果遇到\(a_i<a_{i-1}\)的情况,则判定无法实现,因为\(a_{i-1}\)已经是满足单调递增情况下的最小值。如果所有\(1\le i\le pos\)全部执行完毕,但是\(a_{pos}>a_{pos+1}\)也判定无法实现,因为此时一定\(x<a_{pos}<a_{pos+1}\),无法进行后续操作。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=510,inf=0x3f3f3f3f;
int a[N]; 
int main()
{
	int t,n,x;
	scanf("%d",&t);
	while(t--)
	{
		int ans=0,pos=0; 
		bool flag=0;
		scanf("%d%d",&n,&x);
		for(int i=1;i<=n;i++) 
		{
			scanf("%d",&a[i]); 
			if(a[i]<a[i-1]) pos=i;
		}
		for(int i=1;i<pos;i++)
		{
			if(a[i]>x) {ans++; swap(a[i],x);}
			else if(a[i]<a[i-1]) {flag=1; break;}
		}
		if(a[pos-1]>a[pos] || flag) printf("-1\n");
		else printf("%d\n",ans);
	}
	return 0;
}
posted @ 2020-12-20 10:58  violet_holmes  阅读(61)  评论(1编辑  收藏  举报