题面:
题意:
给 a a a 个 0 0 0, b b b 个 1 1 1,你要构造两个二进制数 x , y x,y x,y ,使得 x − y x - y x−y 的二进制里有 k k k 个 1 1 1 。
思路:
x:11…0…
y:10…1…
x
x
x 和
y
y
y 的
.
.
.
...
... 部分对应都是
1
1
1 或者
0
0
0 ,因为对应位置都是
1
1
1 或者
0
0
0 就会抵消掉。让第一个
.
.
.
...
... 有
k
−
1
k-1
k−1个
1
1
1 和
0
0
0 ,剩下的放到第二个
.
.
.
...
... 就可以满足结果的二进制中有
k
k
k 个
1
1
1 。
再特判一下
a
≤
1
,
b
=
=
0
a \leq 1,b==0
a≤1,b==0 的情况。
代码太丑了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6 + 10;
int ans1[maxn],ans2[maxn];
int main() {
int a,b,k;
scanf("%d%d%d",&a,&b,&k);
if(a == 0) {
if(k)puts("No");
else {
puts("Yes");
for(int i = 1; i <= b; ++i) {
cout<<"1";
}
cout<<endl;
for(int i = 1; i <= b; ++i) {
cout<<"1";
}
cout<<endl;
}
} else if(b == 1) {
if(k == 0) {
puts("Yes");
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 puts("No");
} else {
if(k == 0) {
puts("Yes");
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;
return 0;
}
b -= 2;
a -= 1;
if(k > a + b + 1) {
puts("No");
} else {
int cnt = 2;
ans1[1] = ans2[1] = 1;
ans1[2] = 1,ans2[2] = 0;
for(int i = 1; i < k; ++i) {
if(a > 0) {
ans1[++cnt] = 0;
ans2[cnt] = 0;
a--;
} else {
ans1[++cnt] = 1;
ans2[cnt] = 1;
b--;
}
}
ans1[++cnt] = 0;
ans2[cnt] = 1;
while(a > 0 || b > 0) {
if(a > 0) {
ans1[++cnt] = 0;
ans2[cnt] = 0;
a--;
} else {
ans1[++cnt] = 1;
ans2[cnt] = 1;
b--;
}
}
puts("Yes");
for(int i = 1; i <= cnt; ++i) {
cout<<ans1[i];
}
cout<<endl;
for(int i = 1; i <= cnt; ++i) {
cout<<ans2[i];
}
cout<<endl;
}
}
return 0;
}