Codeforces(B. Circus)

Codeforces(B. Circus)_第1张图片

这题读完后大概率会想到分类讨论去做。
但是,这题分类讨论太毒了,各种情况都要处理的很细节,一不小心就写错了

用公式表示,然后暴力就好了
代码:

#include 
#define ll long long
using namespace std;

int n;
int v1=0,v2=0,v3=0,v4=0;
string s,t;
int query(int a,int b,int c,int d)
{
     
    if(a+b+c+d!=n/2)
    {
     return 0;}
    if(a<0||b<0||c<0||d<0)
    {
     return 0;}
    if(a>v1||b>v2||c>v3||d>v4)
    {
     return 0;}
    if((b+d)!=(v3-c+v4-d))
    {
     return 0;}
    return 1;
}
void pp(int a,int b,int c,int d)
{
     
    for(int i=0;i<n;i++)
    {
     
        if(s[i]=='0'&&t[i]=='0'&&a>0){
     cout<<i+1<<" ";a--;}
        if(s[i]=='1'&&t[i]=='0'&&b>0){
     cout<<i+1<<" ";b--;}
        if(s[i]=='0'&&t[i]=='1'&&c>0){
     cout<<i+1<<" ";c--;}
        if(s[i]=='1'&&t[i]=='1'&&d>0){
     cout<<i+1<<" ";d--;}
    }
    cout<<endl;
}
int main()
{
     
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    cin>>s;
    cin>>t;
    for(int i=0;i<n;i++)
    {
     
        if(s[i]=='0'&&t[i]=='0')
        {
     v1++;}
        if(s[i]=='1'&&t[i]=='0')
        {
     v2++;}
        if(s[i]=='0'&&t[i]=='1')
        {
     v3++;}
        if(s[i]=='1'&&t[i]=='1')
        {
     v4++;}
    }
    int a,b,c,d,flag=0;
    for(int i=0;i<=n/2;i++)
    {
     
        for(int j=0;j<=i;j++)
        {
     
            b=j;
            d=i-b;
            c=v3+v4-d-i;
            a=n/2-d-b-c;
            if(query(a,b,c,d))
            {
     
                flag=1;
                pp(a,b,c,d);
                break;
            }
        }
        if(flag){
     break;}
    }
    if(!flag)
    {
     cout<<"-1"<<endl;}
    return 0;
}

你可能感兴趣的:(题解)