UVa 11111 - Generalized Matrioshkas解题报告

一道题意很难读懂的题目,实际上是括号匹配的加强版。新增的要求是内括号的值小于外括号的值。如果一个大括号包涵几个内括号,且内括号的总和不超过大括号的值。满足条件为真,反之为假。题目很抽象,把数组当成括号可以容易理解一些。

思路:用结构体表示值和空间,大括号内的小括号会占用空间,当空间小于0时说明不满足条件。这一点我想了很久,参考了别人的思路。这个条件有点难想到,最好是手动模拟一下。

//11111 - Generalized Matrioshkas
#include <iostream>
#include <stack>
#include <cmath>
using namespace std;
int a[10000005];
struct nobe
{
	int data, space;
}T;
int main()
{
	//freopen("data.txt", "r", stdin);
	char c;
	int n = 0;
	while (scanf("%d%c", &a[n++], &c) == 2)
	{
		int flag;
		if(c == '\n')
		{
			stack<nobe> st;
			for(int i = 0; i < n; i++)
			{
				flag = 1;
				T.data = abs(a[i]);
				T.space = abs(a[i]);
				if(a[i] < 0)
				{
					if(st.empty())//空栈不能减去前一个的空间
						st.push(T);
					else 
						st.top().space += a[i], //减去前一个的空间
						st.push(T);
				}
				else if(!st.empty())
				{
					if(st.top().data != a[i] || st.top().space <= 0)//如果不匹配,或者前者的空间小于0,即不满足外层括号的值大于内层括号的要求
						break;
					st.pop();//如果满足条件,弹栈
				}
				else//@如果空栈且还有正值,说明不匹配
				{
					flag = 0;
					break;
				}
			}
			n = 0;//@
			if(flag && st.empty())
				cout << ":-) Matrioshka!\n";
			else
				cout << ":-( Try again.\n";
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值