题目内容
给定一个长度在
1
1
1 到
60
60
60 之间字符串,字符串取值为 '1', '0', '?'
,一个正整数
n
n
n 。
现在将 '?'
修改为 '1'
或者 '0'
,使得
01
01
01 串对应的十进制数
x
x
x 尽可能大,但是
x
≤
n
x\leq n
x≤n ,如果不能做到,输出
−
1
-1
−1,否则输出
x
x
x 。
数据范围
- s i ∈ [ ′ 0 ′ , ′ 1 ′ , ′ ? ′ ] s_i\in['0','1','?'] si∈[′0′,′1′,′?′]
- 1 ≤ len(s) ≤ 60 1\leq \operatorname{len(s)}\leq 60 1≤len(s)≤60
- 1 ≤ n ≤ 1 0 18 1\leq n\leq 10^{18} 1≤n≤1018
题解
从高位到低位贪心修改即可,如果高位能修改为 '1'
,则修改为 ’1‘
,否则修改为 '0'
,如果都为 '0'
的情况下仍然不能使得结果小于等于 n
,则输出
−
1
-1
−1 。
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin >> s;
long long x;
cin >> x;
int n = int(s.size());
long long val = 0;
for (int i = 0; i < n; ++i) {
if (s[i] != '?') {
int b = s[i] - '0';
if (b) val |= 1ll << (n - 1 - i);
}
}
if (val > x) {
cout << "-1\n";
return 0;
}
for (int i = 0; i < n; ++i) {
if (s[i] == '?') {
if (val + (1ll << (n - 1 - i)) <= x) {
val += 1ll << (n - 1 - i);
s[i] = '1';
} else {
s[i] = '0';
}
}
}
cout << val << "\n";
return 0;
}