题目链接
题目大意:给出你a个0,b个1,让你构造成两个二进制(没有前缀0),两个作差使得差有k个1,(没有前缀0).
题解:既然我们构造出差为k个1那么
11 ∗ ∗ ∗ ∗ ( k − 1 ) ∗ ∗ 0 ∗ ∗ ∗ ∗ 11****(k-1)**0**** 11∗∗∗∗(k−1)∗∗0∗∗∗∗
10 ∗ ∗ ∗ ∗ ( k − 1 ) ∗ ∗ 1 ∗ ∗ ∗ ∗ 10****(k-1)**1**** 10∗∗∗∗(k−1)∗∗1∗∗∗∗
举个例子就是:
11000001000011
10000001001011
做差得:
00111111111000
我么可以看出中间有00000100
这些是相同的,也就是我们错开(k-1)位的话会产生k个1;。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,k;
string x,y;
int main()
{
cin>>a>>b>>k;
if(k==0){
cout<<"YES"<<endl;
for(int i=1;i<=b;i++) cout<<"1";
for(int i=1;i<=a;i++) cout<<"0";
cout<<endl;
for(int i=1;i<=b;i++) cout<<"1";
for(int i=1;i<=a;i++) cout<<"0";
cout<<endl;
}else if(a<1||b<2||a+b-2<k){
cout<<"NO"<<endl;
}else {
x="11";///分界点1
y="10";
b-=2;
a--;
for(int i=1;i<k;i++){
if(a>0){
///先用0
x+="0";
y+="0";
a--;
}else if(b>0){
///后用1
x+="1";
y+="1";
b--;
}
}
x+="0";///分界点2
y+="1";
while(a--){
x+="0";
y+="0";
}
while(b--){
x+="1";y+="1";}
cout<<"YES"<<endl;
cout<<x<<endl;
cout<<y<<endl;
}
return 0;
}