您的位置:首页 > 移动开发 > IOS开发

UVa 11111 - Generalized Matrioshkas

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

代码如下:
#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