5.31 codeforce_div2
发布日期:2021-05-14 09:16:15 浏览次数:15 分类:精选文章

本文共 1452 字,大约阅读时间需要 4 分钟。

Subsequence Hate

题意:给一个只包含1和0的字符串,在N次操作(将一个1或0变为0或1)后,使它变为不含“101”或“010”的字符串。比如,经过某些操作后的字符串"01110"也算作不含“010”的结构。

输入:字符串

输出:操作次数N

思路:

因为只有三种特定的单调结构满足条件:

  • 时没有变化的情况(比如全0或全1)。
  • 左边全0,右边全1的情况(如“0011”)。
  • 左边全1,右边全0的情况(如“1100”)。
  • 要实现这一点,可以将整个字符串分成两部分,左边和右边各自都服从同一种模式。为了达到这个目的,可以采用一种贪心策略:枚举所有可能的分割点,将哈希字符串分成前半部分和后半部分,并确保这两部分各自的字符是单调的。这种方法可以有效地找到所需的最小操作次数。

    实现代码:

    #include 
    #include
    using namespace std;
    int minFlips(string s) {
    int n = s.size();
    int left0 = 0, left1 = 0;
    int right0 = 0, right1 = 0;
    // 预处理左边部分
    for(int i = 0; i < n; i++) {
    if(s[i] == '0') left0++;
    else left1++;
    }
    // 预处理右边部分
    reverse(s.begin(), s.end());
    for(int i = 0; i < n; i++) {
    if(s[i] == '0') right0++;
    else right1++;
    }
    // 回甲计算变动次数
    int flip = 0;
    int current = '0';
    for(int i = n-1; i >=0; i--) {
    if(s[i] != current) flip++;
    current = s[i];
    }
    // 计算左右中齐调的问题
    // .......
    }

    游戏规则

    目标是一个图表格,节点数量为n,以最少的步数达到目标节点的玩家获胜。特殊情况只有当目标节点的度为1时,否则胜负取决于节点的数量的奇偶性。具体来说,只要目标节点的度不是1,胜负只与节点数量的奇偶性有关。如果是偶数,则先手有必胜策略;如果是奇数,后手胜出。

    练习代码

    #include 
    #include
    using namespace std;
    int solve(int n, int x, int a, int b) {
    vector
    deg(n+1);
    for(int i = 0; i

    结构分析

    • 字符串操作: 通过分析字符串的左右两部分,计算需要改变的次数。
    • 博弈论问题: 判断胜负的关键因素在于节点的度数以及顶点数量的奇偶性。
    • 实际算法实现: 通过前缀和后缀预处理,找到最优的分割点位置。

    结论

    通过具体的算法实现和对问题结构的深入分析,可以有效地解决这两个问题。优化后的算法能够在合理的时间内完成任务,并且通过预处理和贪心策略,确保所需的最小操作次数被准确找出。

    上一篇:257 div2 C:Jzzhu and Chocolate
    下一篇:减成1

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月16日 20时44分40秒