• [CF1204D2] Kirk and a Binary String


    [CF1204D2] Kirk and a Binary String - 思维

    Description

    给定一个 01 串,要你求出另一个长度相等串使得任意区间内最长不降子序列的长度与原串相等且 0 的总数尽量多。

    Solution

    我们要将一些 1 改成 0,将某一个 1 改成 0 的条件是它后面的 0 的个数不少于 1 的个数,这个条件保证了这次修改不会影响正确性

    在这个条件下,我们贪心地修改,倒序扫描整个序列,能修改就修改

    括号序列视角:0 看成左括号,1 看成右括号,那么最长不降子序列就是最长的可以匹配的子括号序列长度,这样理解起来会很清楚

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    const int N = 1e6 + 5;
    
    int n;
    char s[N];
    
    signed main()
    {
        cin >> s + 1;
        n = strlen(s + 1);
    
        int stack_size = 0;
        for (int i = n; i >= 1; i--)
        {
            if (s[i] == '0')
            {
                ++stack_size;
            }
            else
            {
                if (stack_size > 0)
                {
                    --stack_size;
                }
                else
                {
                    s[i] = '0';
                }
            }
        }
        cout << s + 1 << endl;
    }
    
  • 相关阅读:
    缺失的第一个正数
    tuple用法
    整数转罗马数字
    三种时间格式的转换
    不同包的调用
    正则表达式
    lgb模板
    线性回归
    时间序列的特征
    3D聚类
  • 原文地址:https://www.cnblogs.com/mollnn/p/14356698.html
Copyright © 2020-2023  润新知