Krydom: 暁の水平线に胜利を刻むのです

ソロモンの悪夢、見せてあげる!

@krydom1年前

12/27
15:14
模拟 贪心

[bzoj 3016] Usaco2012 Nov Clumsy Cows

00:00/00:00

♦♦♦♦♦♦   Description   ♦♦♦♦♦♦

Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clumsy (due to her large hooves) that she keeps mis-typing characters. Please help her by computing the minimum number of characters in the string that one must reverse (e.g., changing a left parenthesis to a right parenthesis, or vice versa) so that the string would become balanced. There are several ways to define what it means for a string of parentheses to be "balanced". Perhaps the simplest definition is that there must be the same total number of ('s and )'s, and for any prefix of the string, there must be at least as many ('s as )'s. For example, the following strings are all balanced:

()
(())
()(()())
while these are not:
)(
())(
((())))
问题描述
给定长度为n的一个括号序列,每次修改可以修改一个位置的括号,若这个括号为’(‘,则修改为’)’,若这个括号为’)’,则修改为’(‘,问最少修改多少个使得原括号序列合法。
其中:
①     ()是合法的;
②     若A是合法的,则(A)是合法的;
③     若AB都是合法的,则AB是合法的。

♦♦♦♦♦♦   Input   ♦♦♦♦♦♦

一个长度为n个括号序列。

♦♦♦♦♦♦   Output   ♦♦♦♦♦♦

最少的修改次数。

♦♦♦♦♦♦   Sample Input   ♦♦♦♦♦♦

())(

♦♦♦♦♦♦   Sample Output   ♦♦♦♦♦♦

2

样例说明
修改为()(),其中红色部分表示修改的括号。

数据范围
100%的数据满足:1 <= n <= 100,000。

♦♦♦♦♦♦   Hint   ♦♦♦♦♦♦

♦♦♦♦♦♦   题解  ♦♦♦♦♦♦

ans表示最后的答案,s表示当前前面有几个多余的(,如果s为负的话就inc(s,2),inc(ans),表示要将这个)改成(。结束后如果s<>0还有inc(ans,s>>1),表示要把剩下的(的一半改成)

c++:

pascal:

 

[bzoj 3016] Usaco2012 Nov Clumsy Cows