Educational Codeforces Round 99 (Rated for Div. 2) D题 Sequence and Swaps

题意:
给出一个长度为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;
	}	
}


猜你喜欢

转载自blog.csdn.net/weixin_45755679/article/details/110419619