1455D. Sequence and Swaps(思維)

issue敲膩害發表於2020-11-30

這個好像思維難度蠻低的…

因為不論怎麼交換 x x x的值,只要進去換了,必定會有一個原陣列 a a a內的元素出來

由於 n n n不大我們果斷列舉那個出來的元素,然後把 x x x加入進去

那麼對這個新的陣列 b b b排序

現在的任務就是如果把 a a a陣列變成 b b b

然後注意到 x x x的交換條件是 a i > x a_i>x ai>x

所以必然是從前往後判斷,若 a i = = b i a_i==b_i ai==bi忽略就行

a i ! = b i a_i!=b_i ai!=bi必定要交換 x x x a i a_i ai

此時需要滿足 a i > x a_i>x ai>x x > = a i − 1 x>=a_i-1 x>=ai1

因為需要滿足遞增而且能交換

這樣就很簡單了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int n,m,a[maxn],x,b[maxn],k;
int main()
{
	int t; cin >> t;
	while( t-- )
	{
		cin >> n >> k;
		int ans = 1e9,ok=1;
		for(int i=1;i<=n;i++)
		{
			cin >> a[i];
			if( a[i]<a[i-1] )	ok=0;
		}
		if( ok ){ cout << 0 << endl; continue; }
		for(int i=1;i<=n;i++)
		{
			b[i]=k;
			for(int j=1;j<=n;j++)
				if( j!=i )	b[j]=a[j];
			sort( b+1,b+1+n );//最終的序列
			int temp = 0,now = k,flag=1;
			for(int j=1;j<=n;j++) 
			{
				if( a[j]==b[j] )	continue;
				else//不相等要交換 
				{
					if( a[j]<=now )	flag=0;//要交換卻反而不能交換 
					else//可以交換啊
					{
						temp++;
						if( b[j-1]>now )	flag = 0;//需要保證交換後是大於之前的數字的 
						now = a[j];	
					}
				}
				if( flag == 0 )	break; 
			}
			if( flag )	ans = min( ans,temp );
		}
		if( ans==1e9 )	ans=-1;
		cout << ans << endl;
	}
}

相關文章