2025/09/07 练习
D. Binary String Battle
\(\hspace{20px}\)给 \(Alice\) 和 \(Bob\) 一个长度为 \(n\) 的二进制字符串 \(s\) 和一个整数 \(k\) ( \(1\leq k< n\) )。
\(\hspace{20px}\)如果 \(Alice\) 能将 \(s\) 中的所有字符转化为 \(0\),她就赢了。如果 \(Alice\) 无法在有限的步数内获胜,那么 \(Bob\) 获胜。
\(\hspace{20px}Alice\) 和 \(Bob\) 轮流行动,爱丽丝先下。
- 轮到 \(Alice\) 时,她可以在 \(s\) 中选择长度为 \(k\) 的任意子序列,然后将该子序列中的所有字符设为 \(0\)。
- 轮到 \(Bob\) 时,他可以选择 \(s\) 中任意长度为 \(k\) 的子串,然后将该子串中的所有字符设为 \(1\)。
\(\hspace{20px}\)请注意,如果在游戏过程中的任何时候,包括在 \(Alice\) 和 \(Bob\) 的回合之间,字符串都是 \(0\),那么 \(Alice\) 就赢了。请确定谁能以最佳下法获胜。
\(\hspace{20px}\)Link
统计字符串 \(s\) 中 \(1\) 的个数为 \(cnt\),有:
Case 1 : 当 \(cnt \le k\) 时,\(Alice\) 必胜。
Case 2 : 当 \(cnt > k\) 且 \(n \ge 2k\) 时,\(Bob\) 必胜。无论 \(Alice\) 选择如何选择,总会剩一个,那么 \(Bob\) 可以无视这个去选其他连续 \(k\) 长度的,这样总是剩下 \(k+1\) 长度的字符串。
Case 3 : 当 \(n < 2k\) 时,\(Alice\) 必胜。每个长度为 \(k\) 的子串都包含 \(s_k\) 元素,\(Alice\) 只需将 \(s_k\) 留到最后一次选择即可,这样每一轮都会使得 \(cnt\) 减少。
点击查看代码
void solve(){
int n, k;
cin >> n >> k;
string s;
cin >> s;
int cnt = 0;
for(int i = 0;i < n;i++){
if(s[i] == '1'){
cnt++;
}
}
if(cnt <= k || n < 2 * k) cout << "Alice\n";
else cout << "Bob\n";
}
浙公网安备 33010602011771号