• noip模拟赛 括号序列


    题目描述
    LYK有一个括号序列,但这个序列不一定合法。
    一个合法的括号序列如下:
    ()是合法的括号序列。
    若A是合法的括号序列,则(A)是合法的括号序列。
    若A和B分别是合法的括号序列,则AB是合法的括号序列。
    LYK想通过尽可能少的操作将这个不一定合法的括号序列变成合法的括号序列。一次修改操作是将某个字符变成另一个字符。
    你能帮帮它吗?

    输入格式(bracket.in)
    一行一个字符串S。

    输出格式(bracket.out)
    一个数表示最少修改次数。

    输入样例
    ()))

    输出样例
    1

    样例解释
    将第二个字符修改成(即可。

    数据范围
    对于30%的数据|S|<=10。
    对于60%的数据|S|<=1000。
    对于100%的数据|S|<=100000。且|S|是偶数。

    分析:比较水的一道题,将所有符合要求的括号序列给删掉,剩下的大概长这样:)))))(((((,假设有cnt1个),cnt2个(,那么每个)转一下可以与)配对,如果是奇数个,那么肯定还要和(配对,所以答案是cnt1/2 + cnt1 % 2 + cnt2/2 + cnt2 % 2.

    #include <stack>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    char s[100010];
    int cnt1, cnt2, ans;
    
    int main()
    {
        scanf("%s", s + 1);
        for (int i = 1; i <= strlen(s + 1); i++)
        {
            if (s[i] == '(')
                cnt1++;
            else
                if (s[i] == ')' && cnt1)
                    cnt1--;
                else
                    cnt2++;
        }
        ans = cnt1 / 2 + (cnt1 % 2) + cnt2 / 2 + (cnt2 % 2);
        printf("%d
    ", ans);
    
        return 0;
    }
  • 相关阅读:
    经典排序——希尔排序
    经典排序——插入排序
    使用Ajax验证用户名是否存在
    样式小记
    JavaScript学习笔记(二)
    SpringBoot访问静态视图的两种方式
    扩展SpringMVC-Configuration
    ViewResolver -Springboot中的视图解析器
    SpringBoot必知必会-yaml基础语法
    IDE 下载资源整理
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7683157.html
Copyright © 2020-2023  润新知