给定 3 个数字 a、b、k,找到两个二进制数字 x、y (x > y),满足如下条件:(1) x 和 y 都有 a 个 0,b 个 1;(2) x - y 二进制下有 k 个 1。
x 和 y 都不能有前导零。
0
≤
a
;
1
≤
b
;
0
≤
k
≤
a
+
b
≤
2
⋅
1
0
5
0 \le a; 1 \le b; 0 \le k \le a + b \le 2 \cdot 10^5
0≤a;1≤b;0≤k≤a+b≤2⋅105 。
思路:
构造方法很巧妙
对于
k
≤
a
(
a
=
4
,
b
=
4
,
k
=
3
)
k \le a(a = 4, \ b = 4, k = 3)
k≤a(a=4,b=4,k=3):
x
=
11110000
y
=
11100010
x
−
y
=
00001110
\ \ \ \ \ \ \ x = 11110000\\\ \ \ \ \ \ \ y = 11100010\\x - y = 00001110
x=11110000y=11100010x−y=00001110
这样的话,k 最多只能为4:
x
=
11110000
y
=
11100001
x
−
y
=
00001111
\ \ \ \ \ \ \ x = 11110000\\\ \ \ \ \ \ \ y = 11100001\\x - y = 00001111
x=11110000y=11100001x−y=00001111
对于
k
>
a
k > a
k>a, 1 的数量还可以继续增加,方法是将 y 的左边前缀的 1 的最右边那个右移,就可以将 1 的数量增加 1,如下所示:
x
=
11110000
y
=
11010001
x
−
y
=
00011111
\ \ \ \ \ \ \ x = 11110000\\\ \ \ \ \ \ \ y = 11010001\\x - y = 00011111
x=11110000y=11010001x−y=00011111
那么最优情况就为:
x
=
11110000
y
=
10110001
x
−
y
=
00111111
\ \ \ \ \ \ \ x = 11110000\\\ \ \ \ \ \ \ y = 10110001\\x - y = 00111111
x=11110000y=10110001x−y=00111111
上述构造过程表明,k 最大为 a + b - 2,因此若 k 大于 a + b - 2,就不可构造,除了这种不可构造的情况外,还有很多其他的情况(此题难就难在这,要细心),我们要考虑 a = 0, b = 1, k = 0 时的情况,写代码时不能先判断 k 是否大于 a + b - 2,因为当 k = 0 时,若 a = 0, b = 1,那么 a + b - 2 = -1,此时 k 一定大于 -1,即答案输出了 “No”,而答案是有解的(x = 1、y = 1)。所以要首先判断 k 是否为 0,然后再判断在 k 不为 0 的情况下,a 和 b 是否合法,最后才判断 k > a + b - 2,详细见代码。
遇到问题多考虑一下边界值!
AC Codes:
#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;intmain(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);int a, b, k;
cin >> a >> b >> k;
string s =string(b,'1')+string(a,'0');if(k ==0){
cout <<"Yes"<<'\n';
cout << s <<'\n'<< s <<'\n';}elseif(b ==1|| a ==0){
cout <<"No"<<'\n';}elseif(k > a + b -2){
cout <<"No"<<'\n';}else{
cout <<"Yes"<<'\n';
cout << s <<'\n';if(k <= a){
s[b -1]='0';
s[b -1+ k]='1';}else{
s[1+(b -2)-(k - a)]='0';
s[a + b -1]='1';}
cout << s <<'\n';}return0;}
Codeforces Round #704 (Div. 2) D. Genius‘s Gambit【构造 | 细节】
题意:给定 3 个数字 a、b、k,找到两个二进制数字 x、y (x > y),满足如下条件:(1) x 和 y 都有 a 个 0,b 个 1;(2) x - y 二进制下有 k 个 1。x 和 y 都不能有前导零。0≤a;1≤b;0≤k≤a+b≤2⋅1050 \le a; 1 \le b; 0 \le k \le a + b \le 2 \cdot 10^50≤a;1≤b;0≤k≤a+b≤2⋅105 。思路:构造方法很巧妙对于 k≤a(a=4, b=4,k=3)k \l