题目
分析
给出一组套娃的尺寸数据(每个尺寸r将在数据中先后出现-r,r),问其是否能组合。
思路
每遇到负数将其入栈,遇到正数出栈,此时匹配尺寸数据是否一致,若一致再与栈顶的套娃尺寸比较是否能够包含。
如果输入的数据是奇数个,那么一定有未成对的尺寸数据,那么一定不能组合(这主意好)。
代码
#include <cstdio>
#define MAXN 10000
int a[MAXN], s[MAXN][2];
bool solve(int* p, int l)
{
int top = -1;
for (int i = 0; i < l; i++) {
if (p[i] < 0) { /* push */
s[++top][0] = -p[i];
s[top][1] = 0;
} else {
if (p[i] != s[top][0]) return false;
else if (top) s[--top][1] += p[i]; /* pop */
if (s[top][0] <= s[top][1]) return false;
}
}
return true;
}
int main()
{
int i;
char c;
for (i = 0; ~scanf("%d%c", &a[i++], &c);) {
if (c == '\n') {
if (i % 2) printf(":-( Try again.\n");
else printf(solve(a, i) ? ":-) Matrioshka!\n" : ":-( Try again.\n");
i = 0;
}
}
return 0;
}