Codeforces Round #545 (Div. 2)

25 篇文章 0 订阅

B. Circus

theme:给定n个人,2≤n≤5000且n为奇数。,每个人都有两个属性c与a,c[i]==0代表第i个人没有属性c,为1代表有,a同理。先要把这n个人均分为两组,要求第1组中有属性c的人数与第二组中有属性a的人数相同,输出一种分法中第一组的人的编号。

solution:对于每个人的属性有四种情况:(1,1)、(1,0)、(0,1)、(0,0)。设每种情况的人数为a,b,c,n-a-b-c,这些都是可以统计出的。设第一组中这四种人的个数分别为x,y,z,n/2-x-y-z,则第二组中个数为a-x,b-y,c-z,n/2-a-b-c+x+y+z。条件为x+y=a-x+c-z化简得2x+y+z=a+b,所以是求三个未知数,那么遍历x,y即可,求出z检查范围。

#include<bits/stdc++.h>
#define far(i,t,n) for(int i=t;i<n;++i)
#define pk(x) push_back(x)
#define endl "\n"
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
 
char c[5005],a[5005];
vector<int>v[4],ans;
 
int main()
{
    int n;
    cin>>n;
    scanf("%s%s",c,a);
    far(i,0,n)
    {
        if(c[i]=='1'&&a[i]=='1')
            v[0].pk(i);
        else if(c[i]=='0'&&a[i]=='1')
            v[1].pk(i);
        else if(c[i]=='1'&&a[i]=='0')
            v[2].pk(i);
        else
            v[3].pk(i);
    }
    int l[4];
    far(i,0,4)
        l[i]=v[i].size();
    far(x,0,l[0]+1)
        far(y,0,l[1]+1)
        {
            int z=l[0]+l[1]-2*x-y;
            int m=n/2-x-y-z;
            if(z>=0&&z<=l[2]&&m>=0&&m<=l[3])
            {
                far(i,0,x)
                    printf("%d ",v[0][i]+1);
                far(i,0,y)
                    printf("%d ",v[1][i]+1);
                far(i,0,z)
                    printf("%d ",v[2][i]+1);
                far(i,0,m)
                    printf("%d ",v[3][i]+1);
                puts("");
                return 0;
            }
        }
    cout<<-1<<endl;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值