题解:像套娃一样,以下面一组测试样例为例:
-9 -7 -2 2 -3 -2 -1 1 2 3 7 9
9包含了7,7 < 9,所以正确,7包含了2、3,2 + 3 < 7,所以正确,3包含了2,2 < 3,所以正确,2包含了1,同理正确,输出Mat....!.做法是-9先入栈,下一个数如果是负数,就让栈顶减下一个数,结果为负就赋给栈顶并且下一个数压栈,否则输出错误;下一个数如果是正数,就和栈顶相加,如果结果大于等于0,当前栈顶出栈,否则输出错误;开始前先判断所有正和负各自相加看是否和为0,判断套娃是否上下匹配。
#include <cstdio>
#include <stack>
using namespace std;
const int N = 10010;
int main() {
stack<int> s;
int a[N];
int n = 0, i;
double sum1 = 0;
double sum2 = 0;
char c;
while (scanf("%d%c", &a[n++], &c) != EOF) {
if (c == '\n') {
if (n % 2 != 0) {
printf(":-( Try again.\n");
n = 0;
continue;
}
sum1 = sum2 = 0;
for (i = 0; i < n; i++) {
if (a[i] > 0)
sum1 += a[i];
else
sum2 += a[i];
}
if ((sum1 + sum2) != 0) {
printf(":-( Try again.\n");
n = 0;
continue;
}
s.push(a[0]);
for (i = 1; i < n; i++) {
if (a[i] < 0) {
int temp = s.top() - a[i];
if (temp < 0) {
s.top() = temp;
s.push(a[i]);
}
else
break;
}
else {
int temp = s.top() + a[i];
if (temp >= 0) {
s.pop();
}
else
break;
}
}
if (i == n)
printf(":-) Matrioshka!\n");
else
printf(":-( Try again.\n");
n = 0;
}
}
return 0;
}