杂题 swap

从别人那里得到的模拟题。
题目大意(原题是图片,懒得放上来):给一个整数n(1<=n<=1000)以及一个长度为n的字串s,s只包含0和1,且s成环,字串中可取任意两个字符交换。求最小交换次数使得0全部在一起,1全部在一起。

我们先把字串复制一遍,破环,然后我们可以求出字串中有多少个1(0也行),设这个数为cnt。从头开始枚举,枚举到n,以枚举的这个数为起点,再枚举cnt个数,遇到0就跟随便一个1交换(ans++),然后取所有起点的maxans即可。
不懂随便YY一下

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1004<<2;
char ss[maxn];
int s[maxn],n,ans=0x3fffff;
int cnt;
int main()
{
	freopen("swap.in","r",stdin);
	freopen("swap.out","w",stdout);
	cin>>n;
	scanf("%s",ss+1);
	for(int i=1;i<=n;i++)
	{
		s[i]=ss[i]-'0';
		s[i+n]=s[i];
	}
	for(int i=1;i<=n;i++)
	{
		if(s[i]==1)
		{
			cnt++;
		}
	}
	for(int i=1;i<=n;i++)
	{
		int anss=0;
		for(int j=i;j<=i+cnt-1;j++)
		{
			if(s[j]==0)
			{
				anss++;
			}
		}
		ans=min(ans,anss);
	}
	cout<<ans;
}


猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/83279564