1 条题解

  • 0
    @ 2026-4-2 15:56:44

    题目题解

    问题理解

    给定长度为 nn 的二进制字符串 ss 和整数 kk1k<n1 \le k < n)。
    Alice 先手,每轮:

    • Alice 选择任意长度为 kk子序列(不一定连续),将其全部设为 00
    • Bob 选择任意长度为 kk子串(连续段),将其全部设为 11

    若某一时刻字符串全为 00,Alice 立即获胜。双方最优,判断谁获胜。


    第一步:Alice 直接获胜的条件

    cntcnt 为字符串中 11 的个数。
    cntkcnt \le k,则 Alice 可以在第一回合选择所有 11 作为子序列(长度恰好为 cntcnt,若不足 kk 可补 00 凑够 kk),将所有 11 变为 00,立即获胜。
    因此:

    $$\text{若 } cnt \le k \quad \Rightarrow \quad \text{Alice 胜}. $$

    第二步:Bob 的胜利条件

    Bob 获胜当且仅当他能保证在 Alice 的每个回合开始前,字符串中至少有 k+1k+111
    因为这样 Alice 每次最多只能翻转 kk11,而 Bob 能通过操作将至少 kk 个位置变回 11,从而保持 11 的数量 k+1\ge k+1


    第三步:当 n2kn \ge 2k 时 Bob 获胜

    n2kn \ge 2k,Bob 有策略保证每次操作后 11 的数量 k+1\ge k+1

    策略
    在 Bob 的回合,他先任意选择一个已有的 11 作为“保留位”(位置 pp),然后选择一个长度为 kk 且不包含 pp 的子串。
    由于 n2kn \ge 2kpp 的左侧或右侧至少有 kk 个位置,因此这样的子串一定存在。
    Bob 将该子串全部设为 11,这样:

    • 该子串贡献 kk11
    • 保留位 pp 本身就是 11(未被影响),

    因此总 11 的数量 k+1\ge k+1

    由于 Bob 能在每轮保持 11 的数量 k+1\ge k+1,Alice 永远无法将全部 11 清零,因此 Bob 获胜。


    第四步:当 n<2kn < 2k 时 Alice 获胜

    n<2kn < 2k,Alice 有获胜策略。

    关键观察
    n<2kn < 2k 时,任意长度为 kk 的子串必然覆盖位置 (n+1)/2\lfloor (n+1)/2 \rfloor(中间位置)。
    特别地,所有长度为 kk 的子串都包含第 n/2\lceil n/2 \rceil 个位置(取整后固定)。

    Alice 的策略
    她始终保留中间位置(记为 pospos)的值为 11,直到最后一回合。
    在每轮她的回合,她选择任意 kk11(不包括 pospos)变为 00
    由于 n<2kn < 2k,除了 pospos 外,剩余位置数 n1<2k1n-1 < 2k-1,但 Alice 总能找到 kk11 吗?需要确保 11 的数量足够。

    更精确的论证
    xx 为当前 11 的数量。若 x>kx > k,Alice 可以翻转 kk11(避开 pospos),使 xx 减少 kk
    随后 Bob 操作:他只能选择包含 pospos 的子串(因为所有长度为 kk 的子串都包含 pospos),且 pospos 当前为 11,因此 Bob 最多只能将其他 k1k-1 个位置变为 11
    因此,Bob 操作后,11 的数量增加最多 k1k-1
    所以每轮净减少至少 1111

    由于 xx 有限且严格递减,最终 xx 会降至 k\le k,此时 Alice 可以在下一轮直接清零获胜。


    最终结论

    综合以上:

    $$\text{结果} = \begin{cases} \text{Alice}, & \text{if } cnt \le k \text{ 或 } n < 2k, \\ \text{Bob}, & \text{otherwise}. \end{cases} $$

    等价于:

    • cntkcnt \le k,Alice 胜。
    • 否则,若 n<2kn < 2k,Alice 胜。
    • 否则 Bob 胜。

    算法步骤

    1. 读入 n,kn, k 和字符串 ss
    2. 统计 11 的个数 cntcnt
    3. cntkcnt \le kn<2kn < 2k,输出 "Alice";否则输出 "Bob"

    时间复杂度

    • 统计 cntcntO(n)O(n)
    • 总复杂度 O(n)2×105O(\sum n) \le 2 \times 10^5,满足要求。

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n, k;
        string s;
        cin >> n >> k >> s;
        
        int cnt = 0;
        for (char c : s) {
            if (c == '1') cnt++;
        }
        
        if (cnt <= k || n < 2 * k) {
            cout << "Alice\n";
        } else {
            cout << "Bob\n";
        }
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        int t;
        cin >> t;
        while (t--) {
            solve();
        }
        
        return 0;
    }
    

    验证样例

    测试用例 nn kk ss cntcnt cntkcnt \le k n<2kn < 2k 结果
    1 5 2 11011 4 5 < 4? 否 Bob
    2 7 4 1011011 5 7 < 8 是 Alice
    3 6 1 010000 1
    4 1111 4 4 < 2 否 Bob
    5 8 3 10110110 5 8 < 6 否
    6 4 111111 6 6 < 8 是 Alice

    与题目输出一致。


    总结

    本题的关键在于:

    1. 11 的数量 k\le k,Alice 直接获胜。
    2. n2kn \ge 2k,Bob 可以通过保留一个 11 并翻转不包含它的子串,保持 11 的数量 k+1\ge k+1,从而获胜。
    3. n<2kn < 2k,Alice 可以每轮净减少 11 的数量,最终获胜。
    • 1

    信息

    ID
    6238
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者