题目链接:https://vjudge.net/problem/CodeForces-1138B 转自:https://blog.csdn.net/wen_yongqi/article/details/88385862 题意:有n个人,每个人可以展示第一项或第二项才能。让你把他们分成两组,需满足:1.两组人数相等 2.第一组展示第一项才能的人等于第二组展示第二项才能的人。 思路:暴力枚举,本应该用四重循环枚举第一组00、01、10、11的人数,但是两重循环就可以。先枚举第一组中10、11的数量,然后就可以得到第二组中11的数量,进而可以得到第二组中01的数量(因为两组能够展示才能的人数相等),然后又因为一组有n/2个人,就可以算出00的个数。
#include <bits/stdc++.h> using namespace std; const int maxn=5005; int cnt[5][5]; char s1[maxn],s2[maxn]; int main() { int n; scanf("%d",&n); getchar(); scanf("%s%s",s1+1,s2+1); for(int i=1; i<=n; i++) { cnt[s1[i]-'0'][s2[i]-'0']++; } for(int a1=0; a1<=cnt[1][0]; a1++)//第一组10的数量 { for(int a2=0; a2<=cnt[1][1]; a2++)//第一组11的数量 { int b2=cnt[1][1]-a2;//第二组11的数量 int b1=a1+a2-b2;//第二组01的数量 if(b1<0||b1>cnt[0][1]) continue; int a3=cnt[0][1]-b1;//第二组中多余的01需要放到第一组当成第一组的00 int a4=n/2-a3-a1-a2;//计算第一组中00的数量 if(a4<0||a4>cnt[0][0]) continue; for(int i=1; i<=n; i++) { if(a1&&s1[i]=='1'&&s2[i]=='0') printf("%d ",i),a1--; else if(a2&&s1[i]=='1'&&s2[i]=='1') printf("%d ",i),a2--; else if(a3&&s1[i]=='0'&&s2[i]=='1') printf("%d ",i),a3--; else if(a4&&s1[i]=='0'&&s2[i]=='0') printf("%d ",i),a4--; } return 0; } } printf("-1"); return 0; }