P3056[USACO12NOV]ClumsyCowsS
传送门 USACO12NOV]Clumsy Cows S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意
给出一个偶数长度的括号序列,问最少修改多少个括号可以使其平衡。
思路
队列。如果左括号存在一定能和一个右括号配对,如果发生配对,那么就忽视掉这一对括号。那么剩下的一定是))…)))((…(((分别是ri和le个,那么修改个数就是(le>>1)+(ri>>1)+(le&1)+(ri&1).
#include <iostream>
typedef long long ll;
#define qwe(i,a,b) for(int i=a;i<=b;i++)
#define ewq(i,a,b) for(int i=a;i>=b;i--)
inline ll rr(){ll f=1,x=0;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');return f*x;}
using namespace std;
const int INF=0x3f3f3f3f;//无穷大
const ll mod1=1e9+7;//取余
const ll mod2=1e9+9;
const int maxn=1e6+6;
/*给出一个偶数长度的括号序列,问最少修改多少个括号可以使其平衡*/
int main(int argc, char const *argv[]) {
char c;int le=0,ri=0;
while (scanf("%c",&c)!=EOF) {
if(c=='(') le++;
// 左括号>0那么可以和右括号配对,否则单独计入右括号,因为其无法配对
else if(c==')') {if(le>0){le--;}else ri++;}
}
std::cout << (le>>1)+(ri>>1)+(le&1)+(ri&1) << '\n';
return 0;
}