| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
其实不需要用栈,维护一个计数就可以了,代码很简单代码仅供示意和理解
char s[2010],c,*p;
int main() {
int id=1, lb, rb;
while (gets(s) && s[0] != '-')
{
lb = 0;
rb = 0;
p = s;
while (c = *p++)
{
// lb和rb分别记录当前剩余的左括号数和右括号数
// 逐个扫描字符串若发现左括号,左括号计数+1
// 如果是右括号,抵消掉一个左括号,左括号-1,直到左括号抵消完,右括号计数+1
if (c == '{')
lb++;
else if (lb > 0)
lb--;
else
rb++;
}
// 左右括号两两抵消,最后剩余的只可能是3种情况
// 1.剩偶数个左括号
// 2.剩偶数个右括号
// 3.剩若干个右括号和若干个左括号
// 对于1和2,只要调整一半的括号就能达到平衡
// 对于3,如果剩余的左右都是偶数,那么各自调整一半;如果剩余都是奇数,各自调整一半以后,还剩一个右括号和一个左括号,需要调整2次才能平衡,需要额外增加2
// 综合以上情况,可以写出统一的式子如下
printf("%d. %d\n", id++, (lb + rb) / 2 + lb % 2);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator