Codeforces D. Genius‘s Gambit

题目链接
题目大意:给出你a个0,b个1,让你构造成两个二进制(没有前缀0),两个作差使得差有k个1,(没有前缀0).
题解:既然我们构造出差为k个1那么
11 ∗ ∗ ∗ ∗ ( k − 1 ) ∗ ∗ 0 ∗ ∗ ∗ ∗ 11****(k-1)**0**** 11(k1)0
10 ∗ ∗ ∗ ∗ ( k − 1 ) ∗ ∗ 1 ∗ ∗ ∗ ∗ 10****(k-1)**1**** 10(k1)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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45911397/article/details/114227458