Codeforces Round #545 (Div. 2)(B. Circus)
题目链接:http://codeforces.com/contest/1138/problem/B
题目大意:贼绕口的题目,就是给你两个字符串s1,s2,然后每一个人代表一列,第一列代表技能一每个人是否会,第二列代表技能2是否每个人会。然后1代表当前的技能这个人会,0代表不会。
然后让你安排这个n个人去两场演出,要求 第一场的技能一会的人数和第二场技能二会的人数是相同的,然后问你是否有合法的请况,如果有输出第一场派谁去。如果没有,输出-1.
具体思路:(首先四个for循环是肯定会超时的)。我们枚举1 1 和1 0 这两种情况。因为最终每个人都要上场,所以我们确定出第一场中派哪些人去。具体的判断方法:计算当前情况下,第二场中会技能二的人比当前的第一场中会技能一的人多多少人。然后再看一下第一场中会技能一的能不能补出这个空就行了,如果有就输出合法情况。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 2e5+100; 4 vector<int>a; 5 vector<int>b; 6 vector<int>c; 7 vector<int>d; 8 char str1[maxn],str2[maxn]; 9 int main() 10 { 11 int n; 12 scanf("%d",&n); 13 cin>>str1+1; 14 cin>>str2+1; 15 for(int i=1;i<=n;i++){ 16 if(str1[i]=='1'&&str2[i]=='1')a.push_back(i); 17 else if(str1[i]=='1'&&str2[i]=='0')b.push_back(i); 18 else if(str1[i]=='0'&&str2[i]=='1')c.push_back(i); 19 else if(str1[i]=='0'&&str2[i]=='0')d.push_back(i); 20 } 21 for(int i=0;i<=b.size();i++){ 22 for(int j=0;j<=a.size();j++){ 23 int tmp=a.size()+c.size()-j*2-i; 24 if(tmp>=0&&tmp<=c.size()){ 25 int tmp1=i+j+tmp; 26 int tmp2=n/2-tmp1; 27 if(tmp2>=0&&tmp2<=d.size()){ 28 for(int k=0;k<tmp2;k++)printf("%d ",d[k]); 29 for(int k=0;k<i;k++)printf("%d ",b[k]); 30 for(int k=0;k<j;k++)printf("%d ",a[k]); 31 for(int k=0;k<tmp;k++)printf("%d ",c[k]); 32 return 0; 33 } 34 } 35 } 36 } 37 printf("-1\n"); 38 }