https://codeforces.com/problemset/problem/1138/B
题意:
马戏团有n(偶数)个人,可以演小丑,可以演杂技,或者都会,或者都不会。
要分成人数相同的两组,第一组可以演小丑和第二组可以演杂技的人数相同。
思路:
暴力搜,不会T
算出四类人各有多少,然后遍历第一组中演小丑的人数,直接求解
(复杂度n^2, n<5000,不会T);
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdio.h>
#include <map>
#include <vector>
using namespace std;
class sol
{
public:
bool if_get;
int a;
int b;
int c;
int d;
};
sol solution;
int main()
{
char a[5010], c[5010];
int cnt = 0;
while(scanf("%d", &cnt)!=EOF)
{
memset(&solution, 0, sizeof(sol));
memset(&a, 0, 5000);
memset(&c, 0, 5000);
solution.if_get = false;
if(cnt%2==1)
{
printf("input error!\n");
continue;
}
// printf("intput %d numbers!\n", cnt);
// input
/*
for(int i=0; i<cnt; i++)
{
scanf("%c", &c[i]);
}
for(int i=0; i<cnt; i++)
{
scanf("%c", &a[i]);
}
*/
scanf("%s", c);
scanf("%s", a);
// printf("%s, %s", a, c);
// deal
vector<int> vec[5];
for(int i=0; i<cnt; i++)
{
auto tmp = (a[i]-'0') * 2+(c[i]-'0');
vec[tmp].push_back(i+1);
}
int tmp[4];
for(int i=0; i<4; i++)
{
tmp[i] = vec[i].size();
//printf("[%d] = %d\n", i, tmp[i]);
}
for(int i = 0; i<=tmp[1]; ++i)
{
// i为只小丑的人演小丑
for(int j = 0; j<=tmp[3]; ++j)
{
// find a solution
// j为均可演,演小丑
// point_c 为第一组小丑个数,同样也是第二组的演杂技的个数
int point = i+j;
// 如果技能人数 < 剩余什么都会的人数,不合理
if(point < tmp[3]-j)
{
continue;
}
else
{
// 专演杂技的演员人数
int a_point = point - (tmp[3]-j);
// printf("a_point = %d\n", a_point);
// 若专演杂技的人数不足,不合理
if(a_point > tmp[2])
continue;
else
{
//此时,A组人数为,x, i, tmp[2]-a_point, j 其中x未知
auto x = cnt/2 - i - j -(tmp[2]-a_point);
if(x<0 || x>tmp[0])
continue;
else
{
solution.if_get = true;
solution.a = x;
solution.b = i;
solution.c = tmp[2]-a_point;
solution.d = j;
// printf("point = %d\n",point);
// printf("a = %d b = %d c = %d d = %d\n", x,i,solution.c,j);
break;
}
}
}
}
if(true == solution.if_get)
break;
}
vector<int> answer;
if(true == solution.if_get)
{
while (solution.a)
{
solution.a--;
answer.push_back(vec[0].at(solution.a));
}
while (solution.b)
{
solution.b--;
answer.push_back(vec[1].at(solution.b));
}
while (solution.c)
{
solution.c--;
answer.push_back(vec[2].at(solution.c));
}
while (solution.d)
{
solution.d--;
answer.push_back(vec[3].at(solution.d));
}
int all_cnt = answer.size();
// printf("all_cnt = %d\n", all_cnt);
for(int i=0; i<all_cnt; i++)
{
if(i == 0)
printf("%d", answer.at(i));
else
printf(" %d", answer.at(i));
}
printf("\n");
}
else
{
printf("-1\n");
}
}
return 0;
}