codeforces494 div3 B - Binary String Constructing

题意:给你a个0 b个1,要求你构造一个长度为a+b的串,并且要求s[i]!=s[i+1]的i有x个。

一开始我直接暴力枚举全排列,这么做肯定会T。后来发现可以构造序列"01010101010101.....",可以发现要满足s[i]!=s[i+1]的i有x个,则构造出的序列长度是x+1。而且构造出的序列里0和1的个数一定不会超过a和b,也就是说如果有答案,这么构造不会出错,原因读者可以自己想一想。构造完了这个序列后,我们要把多出来的0和1补进去,因为序列首位一定是0,所以多出的0全部插到序列的头部,至于多出的1,当序列尾的数字是1,我们就全部插到尾部,当序列尾数字是0,插到中间的1的后面即可。(原因请读者自己思考)。

注意:上面的 这种构造法是a>=b时,a<b可以构造“1010101010101010.....”

这题的构造方法可能不止一种,但我觉得这种方法是比较合理的。

下面附上代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;

int main()
{
    int a,b,x,num1,num2;
    string str="";
    while(cin>>a>>b>>x)
    {
        str="";
        num1=num2=0;

        if(a>=b)
        {
            for(int i=0; i<=x; i++)
            {
                if(i%2==0)
                    str=str+'0',num1++;
                else str=str+'1',num2++;
            }
            for(int i=0; i<a-num1; i++)
                str='0'+str;
            if(str[str.length()-1]=='1')
            {
                for(int i=0; i<b-num2; i++)
                    str=str+'1';
            }
            else
            {
                for(int i=0; i<b-num2; i++)
                    str=str.insert(str.length()-2,"1");

            }
        }
        else
        {
            for(int i=0; i<=x; i++)
            {
                if(i%2==0)
                    str=str+'1',num1++;
                else str=str+'0',num2++;
            }
            for(int i=0; i<b-num1; i++)
                str='1'+str;
            if(str[str.length()-1]=='0')
            {
                for(int i=0; i<a-num2; i++)
                    str=str+'0';
            }
            else
            {
                for(int i=0; i<a-num2; i++)
                    str=str.insert(str.length()-2,"0");
            }
        }
        cout<<str<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/zero___zero/article/details/80915378
今日推荐