• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yumiym765

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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";
}

posted on 2025-09-07 15:04  羊毛corn  阅读(7)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3