http://acm.hdu.edu.cn/showproblem.php?pid=3351
乍一看很像经典的括号匹配问题,其实不然,因为操作并非增加括号,而是翻转括号
只需记录多余的左括号的数量即可,遇到右括号就减去,左括号数量不足就翻转,最后剩余的左括号一半是需要翻转的(转成右括号)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <map> using namespace std; char s[2005]; int main() { int cas = 1; while(~scanf("%s", s) ) { if(s[0] == '-') break; int len = strlen(s); int cnt = 0; int ans = 0; for(int i = 0; i < len; i++){ if(s[i] == '{') cnt++; else{ if(cnt > 0){ cnt--; } else{ ans++; cnt++; } } } if(cnt > 0) ans += cnt / 2; printf("%d. %d\n", cas++, ans); } return 0; }