Circus(暴力)

链接:Circus

题意:

给a,b两个字符串,代表n名演员是否会小丑和杂技

1代表表演小丑, 0 代表表演杂技,1 代表两个都表演, 0 代表两个都不表演

0                      , 1                      ,1                          , 0

要求选择n/2个演员在第一场演出,使得第一场的小丑和第二次的杂技数目相同

解析

可以直接暴力

遍历a和c的数目i,j

(i+j)是第一场上场的小丑,也是第二次上场的杂技的数目

b-((i+j)-(c-j)) 代表 在第一场上场的只会杂技的数目,(i+j)为第二场的杂技人员,((i+j)-(c-j))在第二场上场的只会杂技的人数

扫描二维码关注公众号,回复: 5483511 查看本文章

化简就是b+c-i-2*j

ac:

#include<bits/stdc++.h>
#define pb push_back
#define MAXN 5005
using namespace std;

char str[MAXN],ctr[MAXN];

int main()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    cin>>str+1>>ctr+1;
    vector<int> aa,bb,cc,dd;
    for(int i=1;i<=n;i++)
    {
        if(str[i]=='1'&&ctr[i]=='0')
            aa.pb(i);
        else if(str[i]=='0'&&ctr[i]=='1')
            bb.pb(i);
        else if(str[i]=='1'&&ctr[i]=='1')
            cc.pb(i);
        else if(str[i]=='0'&&ctr[i]=='0')
            dd.pb(i);
    }
    for(int i=0;i<=(int)aa.size();i++)//a的数目
    {
        for(int j=0;j<=(int)cc.size();j++)//c的数目
        {
            int k=(int)bb.size()+(int)cc.size()-i-2*j;//b的数目
            if(k>=0&&k<=(int)bb.size())
            {
                int l=n/2-i-j-k;//d的数目
                if(l>=0&&l<=(int)dd.size())
                {

                    for(int a=0;a<i;a++)
                        cout<<aa[a]<<" ";
                    for(int b=0;b<j;b++)
                        cout<<cc[b]<<" ";
                    for(int c=0;c<k;c++)
                        cout<<bb[c]<<" ";
                    for(int d=0;d<l;d++)
                        cout<<dd[d]<<(d==l-1?"\n":" ");
                    return 0;
                }
            }
        }
    }
    printf("-1\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41183791/article/details/88377480