UVa 11111 - Generalized Matrioshkas

这个题算是比较抽象的, 相当于“括号平衡”那个题的加强版,首先要用栈判断正负数字平衡,其次在判断每个(括号)里的直接套的那层正数(或是负数之和的绝对值)小于最外层数字 ~

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int stack[10000],sum[10000]; // 需要用到两个数组,一个存括号内直接数字之和,另一个为数字栈
int Num_Balance(int *a, int ct)
{
    int i,top = 0;
    memset(stack,0,sizeof(stack));
    memset(sum,0,sizeof(sum));
    for(i=0; i < ct; i++)
    {
        if(a[i]<0)
        {
            sum[top] -= a[i];  // 将数字加到相应的范围内的和上(这里和下面的“ sum[top--] = 0;”的处理是比较难想的,花了点时间)
            stack[++top] = a[i]; //将数字压入栈内
        }
        else
        {
            if(-stack[top] != a[i]) return 0; // 判断正负平衡
            if(sum[top] >= a[i]) return 0; // 判断数字和
            sum[top--] = 0; // 数字出栈相应位置的和归 0
        }
    }
    return 1;
}
int main()
{
#ifdef state
    freopen("sample.txt","r",stdin);
#endif
    int a[10000],num;
    while(scanf("%d",&num)!=EOF)
    {
        int ct = 0, flag = 0;
        char c;
        while(1)
        {
            a[ct++] = num;
            c=getchar();
            if(c == '\n')
                break;
            scanf("%d",&num);
        }
        if(ct % 2)  // 若数字个数为奇数,直接判断为“Try again”。
            flag = 0;
        else
            flag = Num_Balance(a,ct);
        if(!flag)
            puts(":-( Try again.");
        else
            puts(":-) Matrioshka!");
    }
    return 0;
}

你可能感兴趣的:(c)