以下是我正在处理的问题:http://usaco.org/index.php?page=viewproblem2&cpid=188
以下是解决方案:http://usaco.org/current/data/sol_typo.html
我无法理解解决方案背后的逻辑。谁能请详细解释解决方案?
我是解决这些问题的新手,但我正在努力为11月的第一次USACO比赛做准备。出于澄清目的,我用C ++编写解决方案。
答案 0 :(得分:1)
对于具有平衡括号的字符串,您需要两件事:(
和)
的数量相等,每个(
可以与至少一个{{1}匹配在它的右边。
另一种看待它的方法是将)
视为(
,将+1
视为)
。当您一次处理一个括号时,根据其符号加1或减1,从0开始。如果总和低于0(只有当你点击-1
时才会发生,你知道如果你可以反转一个括号以平衡字符串,它将是那个。一旦你达到这一点,你将总和重置为零。如果总和再次低于零,它将永远不会平衡,所以你可以早进行。
您需要处理的另一种情况是将)
切换为(
将平衡字符串。只有当末尾的总和为2时,您才能执行此操作,因此您可以跟踪上次)
,而总和为> = 2。如果总和是< 2,你无法切换(
。
如果末尾的总和小于零,则字符串将不平衡。如果最后的总和为零,那么如果你发现一个括号要反转,那就是要反转的那个。否则,如果它是(
,您可以交换找到的最后一个2
来平衡字符串。