BZOJ 3016 [Usaco2012 Nov]Clumsy Cows:贪心

时间:2022-10-08 06:29:39

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3016

题意:

  给你一个括号序列,问你至少修改多少个括号,才能使这个括号序列合法。

题解:

  贪心。

  cnt表示当前已经攒了多少个左括号。

  从左往右枚举每一个括号:

    (1)如果为左括号,则cnt++。

    (2)如果为右括号,且cnt > 0,则cnt--。表示消去了一个左括号。

    (3)如果为右括号,且cnt <= 0,则cnt++,ans++。因为此时一定要改。

  最后ans还要加上cnt/2,因为在剩下的左括号中,至少要将一半改为右括号。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h> using namespace std; int cnt=;
int ans=;
string s; int main()
{
cin>>s;
for(int i=;i<s.size();i++)
{
if(s[i]=='(') cnt++;
else if(cnt>) cnt--;
else cnt++,ans++;
}
cout<<ans+cnt/<<endl;
}