题意:
给出一个长度为n的数组,和一个数x,你可以选择数组中的某个大于x元素的元素,将这个元素的值与x的值互换,问最少要做多少次这样的操作,才能使得数组为非递减。
题解:
考虑这种操作的意义,我们可以发现,其实就是将某个数组中的一些数交换位置,并且取出一个数替换成最初的x,因为n只有500,所以我们将x放入数组中,排个序,然后枚举被取出的那个数,对于剩下的n个数,我们将它与原数组比较,若v[i]<a[i],则ans++,若v[i]>a[i],ans=inf,即情况不符合(v[i]为排序后数组,a[i]为原数组)。
为什么v[i]>a[i]不符合呢,因为操作只能选取一个大于x的元素并交换,也就是元素必定会变小。
代码:
#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int MAXN=1e5+5;
const int mod=1e9+7;
int a[505];
int b[505];
std::vector<int> v;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,x;
scanf("%d%d",&n,&x);
int flag=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
if(a[i]<a[i-1])
{
flag=1;
}
}
if(!flag)
{
printf("0\n");
continue;
}
a[n+1]=x;
sort(a+1,a+n+1+1);
int ans=1e9;
for(int i=1;i<=n+1;i++)
{
v.clear();
for(int j=1;j<=n+1;j++)
{
if(i==j) continue;
v.push_back(a[j]);
}
int cnt=0;
for(int j=0;j<v.size();j++)
{
if(v[j]<b[j+1])
{
cnt++;
}
else if(v[j]==b[j+1])
{
continue;
}
else
{
cnt=1e9;
break;
}
}
ans=min(ans,cnt);
}
if(ans==1e9) cout<<-1<<endl;
else cout<<ans<<endl;
}
}