Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

其实不需要用栈,维护一个计数就可以了,代码很简单

Posted by Eov_Second at 2017-01-06 14:51:06 on Problem 3991
代码仅供示意和理解

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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator