因为不论怎么交换 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>=ai−1
因为需要满足递增而且能交换
这样就很简单了
#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;
}
}