UVa 11111 - Generalized Matrioshkas

来源:互联网 发布:彩票源码论坛php 编辑:程序博客网 时间:2024/06/05 10:31

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

代码如下:

#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;}