从别人那里得到的模拟题。
题目大意(原题是图片,懒得放上来):给一个整数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;
}