鄙人不才,此中鄙陋甚多,望海涵!!!
有详细的注释,不再赘述,见代码
C++Code
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,n;
cin>>a>>b>>n;
if(n==0)//当n为0时必然可以构造出来,(b>=1)
{
puts("Yes");
for(int i=1;i<=b;i++) printf("1");
for(int i=1;i<=a;i++) printf("0");
puts("");
for(int i=1;i<=b;i++) printf("1");
for(int i=1;i<=a;i++) printf("0");
}
else if(n+2>b+a || b==1) puts("No");
//当b为1时,由于没有前导0的限制,是无法构造出来的
else if(a==0) puts("No");
//就算满足n+2>b+a,若a为0,那么最后构造出来的只能是n=0
//为什么是这样一个条件呢?简单分析一下
//首先我们有2种方式可供选择
//1.比较简单的一种 比如a b c 分别为 5 3 4
// 11010000
// 11000001
//显然这种方式可行,但前提是咱们的0的数量需要>=k才能这样
//2.第二种方式 比如a b c 分别为 5 3 6,显然a是不够用的
// 11100000
// 10100001
// 中间那个1可以消去,剩下的仍然是第一种模型
// 比如a b c 分别为 5 3 5,显然a仍然是不够用的
// 11100000
// 11000001
//这种方式便可以充分利用0和1
else
{
puts("Yes");
if(a>=n)//说明0够用,直接构造
{
for(int i=1;i<b;i++) printf("1");
for(int i=1;i<=a-n;i++) printf("0");
printf("1");
for(int i=1;i<=n;i++) printf("0");
puts("");
for(int i=1;i<b;i++) printf("1");
for(int i=1;i<=a;i++) printf("0");
puts("1");
}
else//否则需要充分利用0和1
{
for(int i=1;i<=b;i++) printf("1");
for(int i=1;i<=a;i++) printf("0");
puts("");
for(int i=1;i<a+b-n;i++) printf("1");//消去前面1
printf("0");
for(int i=1;i<n-a+1;i++) printf("1");//消去中间1
for(int i=1;i<a;i++) printf("0");
puts("1");//末位
}
}
return 0;
}
昨晚比赛的?
昨天下午吧!