BZOJ3016 [Usaco2012 Nov]Clumsy Cows

蒟蒻还是刷刷水。。。(不要问我这么沙茶的题为何要写题解)

Orz 海之树:"考虑每一个右括号必须要有一个在它之前的左括号相配对,所以用sum记录到当前位置位置还没有配对的左括号的数量。

如果为负数这说明必须有一个右括号要变为左括号,即ans++且sum+=2(因为少了一个右括号的同时多了一个左括号)。

最后加上剩余的未配对的左括号的数量的二分之一即为答案。"

 1 /**************************************************************
 2     Problem: 3016
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:36 ms
 7     Memory:804 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11  
12 using namespace std;
13  
14 int ans, sum;
15  
16 int main() {
17     char ch = getchar();
18     while (ch == '(' || ch == ')') {
19         if (ch == '(') ++sum;
20         else --sum;
21         if (sum < 0) ++ans, sum += 2;
22         ch = getchar();
23     }
24     ans += sum >> 1;
25     printf("%d
", ans);
26     return 0;
27 }
View Code
By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
原文地址:https://www.cnblogs.com/rausen/p/4135655.html