B Circus
题意
给你n个演员的信息(能否演马戏,能否演小丑)
把他们分成两批,使得第一批中能演马戏的演员数量等于第二批中能演小丑的人的数量
solution
枚举:第一批中又能演马戏又能演小丑的人数和第一批中两个都不能演的人数
然后第二批相应项的人数也可以算出来
也就是说,剩下的问题就是剩下两种人的分配,
然后我们发现,这两种人的分配方式对答案(第一批中演马戏的人数减第二批中演小丑的人数)没有影响
然后你就A了这题
code
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 5050
using namespace std;
struct zero{
int a,c;
}lib[N];
int n;
string s;
int ans[N];
int cnt[4];
bool op=true;
int main(){
scanf("%d",&n);
cin>>s;
for(int i=0;i<n;i++)lib[i+1].a=s[i]-'0';
cin>>s;
for(int i=0;i<n;i++)lib[i+1].c=s[i]-'0';
for(int i=1;i<=n;i++){
if(lib[i].a+lib[i].c==0)cnt[0]++;//0 0
else if(lib[i].a==1&&lib[i].c==0)cnt[1]++;//1 0
else if(lib[i].a+lib[i].c==1)cnt[2]++;//0 1
else cnt[3]++;//1 1
}
for(int i=0;i<=cnt[0];i++)//0 0
for(int r=0;r<=cnt[3];r++){
if((cnt[0]-i)+(cnt[3]-r)>n/2||i+r>n/2)continue;
int now1=r,now2=cnt[3]-r;
int needs=n/2-i-r;
int to1=now1,to2=now2;
int ans1,ans2;
if(needs<=cnt[1]){
to1+=needs;
to2+=cnt[2];
ans1=needs,ans2=0;
}
else {
to1+=cnt[1];
to2+=n/2-(cnt[0]-i)-(cnt[3]-r);
ans1=cnt[1];
ans2=needs-cnt[1];
}
if(to1==to2){
ans[0]=i,ans[1]=ans1,ans[2]=ans2,ans[3]=r;
for(int i=1;i<=n;i++){
if(lib[i].a==0&&lib[i].c==0&&ans[0]>0){printf("%d ",i);ans[0]--;}
if(lib[i].a==1&&lib[i].c==0&&ans[1]>0){printf("%d ",i);ans[1]--;}
if(lib[i].a==0&&lib[i].c==1&&ans[2]>0){printf("%d ",i);ans[2]--;}
if(lib[i].a==1&&lib[i].c==1&&ans[3]>0){printf("%d ",i);ans[3]--;}
}
return 0;
}
}
puts("-1");
}