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\n", ans); return 0; }