题意:给你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;
}
}