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代码:

 #include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+;
vector<int>a;
vector<int>b;
vector<int>c;
vector<int>d;
char str1[maxn],str2[maxn];
int main()
{
int n;
scanf("%d",&n);
cin>>str1+;
cin>>str2+;
for(int i=;i<=n;i++){
if(str1[i]==''&&str2[i]=='')a.push_back(i);
else if(str1[i]==''&&str2[i]=='')b.push_back(i);
else if(str1[i]==''&&str2[i]=='')c.push_back(i);
else if(str1[i]==''&&str2[i]=='')d.push_back(i);
}
for(int i=;i<=b.size();i++){
for(int j=;j<=a.size();j++){
int tmp=a.size()+c.size()-j*-i;
if(tmp>=&&tmp<=c.size()){
int tmp1=i+j+tmp;
int tmp2=n/-tmp1;
if(tmp2>=&&tmp2<=d.size()){
for(int k=;k<tmp2;k++)printf("%d ",d[k]);
for(int k=;k<i;k++)printf("%d ",b[k]);
for(int k=;k<j;k++)printf("%d ",a[k]);
for(int k=;k<tmp;k++)printf("%d ",c[k]);
return ;
}
}
}
}
printf("-1\n");
}
上一篇:CAP理论与分布式事务解决方案


下一篇:eclipse新建maven项目出现红叉解决办法