括号序列(bracket)
Time Limit:1000ms Memory Limit:128MB
题目描述
LYK有一个括号序列,但这个序列不一定合法。
一个合法的括号序列如下:
()是合法的括号序列。
若A是合法的括号序列,则(A)是合法的括号序列。
若A和B分别是合法的括号序列,则AB是合法的括号序列。
LYK想通过尽可能少的操作将这个不一定合法的括号序列变成合法的括号序列。一次修改操作是将某个字符变成另一个字符。
你能帮帮它吗?
输入格式(bracket.in)
一行一个字符串S。
输出格式(bracket.out)
一个数表示最少修改次数。
输入样例
()))
输出样例
1
样例解释
将第二个字符修改成(即可。
数据范围
对于30%的数据|S|<=10。
对于60%的数据|S|<=1000。
对于100%的数据|S|<=100000。且|S|是偶数。
题解:贪心
遇到右括号,如果之前有左括号就抵消 否则 step++,把它变成左括号
最后剩下一堆左括号,之前step+左括号个数/2 即可。
本萌妹的AC代码真好看..
#include<iostream> #include<cstdio> #include<cstring> using namespace std; string s; int len,top,ans; int main(){ freopen("bracket.in","r",stdin); freopen("bracket.out","w",stdout); cin>>s;len=s.length(); for(int i=0;i<len;i++){ if(s[i]=='(')top++; if(s[i]==')'){ if(top)top--; else ans++,top++; } } printf("%d\n",ans+top/2); fclose(stdin);fclose(stdout); return 0; }