链接:Circus
题意:
给a,b两个字符串,代表n名演员是否会小丑和杂技
1代表表演小丑, 0 代表表演杂技,1 代表两个都表演, 0 代表两个都不表演
0 , 1 ,1 , 0
要求选择n/2个演员在第一场演出,使得第一场的小丑和第二次的杂技数目相同
解析
可以直接暴力
遍历a和c的数目i,j
(i+j)是第一场上场的小丑,也是第二次上场的杂技的数目
b-((i+j)-(c-j)) 代表 在第一场上场的只会杂技的数目,(i+j)为第二场的杂技人员,((i+j)-(c-j))在第二场上场的只会杂技的人数
扫描二维码关注公众号,回复:
5483511 查看本文章
化简就是b+c-i-2*j
ac:
#include<bits/stdc++.h>
#define pb push_back
#define MAXN 5005
using namespace std;
char str[MAXN],ctr[MAXN];
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
cin>>str+1>>ctr+1;
vector<int> aa,bb,cc,dd;
for(int i=1;i<=n;i++)
{
if(str[i]=='1'&&ctr[i]=='0')
aa.pb(i);
else if(str[i]=='0'&&ctr[i]=='1')
bb.pb(i);
else if(str[i]=='1'&&ctr[i]=='1')
cc.pb(i);
else if(str[i]=='0'&&ctr[i]=='0')
dd.pb(i);
}
for(int i=0;i<=(int)aa.size();i++)//a的数目
{
for(int j=0;j<=(int)cc.size();j++)//c的数目
{
int k=(int)bb.size()+(int)cc.size()-i-2*j;//b的数目
if(k>=0&&k<=(int)bb.size())
{
int l=n/2-i-j-k;//d的数目
if(l>=0&&l<=(int)dd.size())
{
for(int a=0;a<i;a++)
cout<<aa[a]<<" ";
for(int b=0;b<j;b++)
cout<<cc[b]<<" ";
for(int c=0;c<k;c++)
cout<<bb[c]<<" ";
for(int d=0;d<l;d++)
cout<<dd[d]<<(d==l-1?"\n":" ");
return 0;
}
}
}
}
printf("-1\n");
return 0;
}