一道题意很难读懂的题目,实际上是括号匹配的加强版。新增的要求是内括号的值小于外括号的值。如果一个大括号包涵几个内括号,且内括号的总和不超过大括号的值。满足条件为真,反之为假。题目很抽象,把数组当成括号可以容易理解一些。
思路:用结构体表示值和空间,大括号内的小括号会占用空间,当空间小于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;
}