题目链接:http://codeforces.com/contest/1095/problem/E
解题心得:
刚开始拿到这个题的时候还真的没什么思路,后来仔细想想还是比较简单的。首先题目要求翻转一个括号就要达到符合括号的匹配规则,那么在匹配完符合条件的括号之后有多出的两个括号向左或者向右。
其次从左边开始)不能比(多出两个以上,不然无法通过翻转一个得到符合规范的括号列,当刚好多出一个的时候这个括号必须翻转。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6+100; int cnt[maxn], n; char s[maxn]; int main() { //freopen("1.in", "r", stdin); //freopen("1.out", "w", stdout); scanf("%d", &n); scanf("%s", s); int x = 0; for(int i=0;i<n;i++) { if(s[i] == '(') x++; else x--; cnt[i] = x; } for(int i=n-2;i>=0;i--) cnt[i] = min(cnt[i+1], cnt[i]); int ans = 0, b = 0; for(int i=0;i<n;i++) { if(s[i] == '(') { if(cnt[i] >= 2 && x == 2) ans++; b++; } else { if(cnt[i] >= -2 && x == -2) ans++; b--; } if(b < 0) break; } printf("%d", ans); return 0; }