Generalized Matrioshkas
大意:
给出一组数据如-9,-7,-2,2,-3,-1,-2,2,1,3, 7, 9,其中一对相反数如-9,9为一个娃娃的尺寸,9尺寸的娃娃中套着2尺寸和3尺寸的娃娃,
3尺寸的娃娃中又套着1尺寸的娃娃,1尺寸的娃娃套着2尺寸的娃娃,因为相邻内部的娃娃尺寸之和不能大于或等于相邻的外部娃娃的尺寸,2>1,输出TRY AGAIN
要点:
使用两个栈,一个存放娃娃的尺寸负数,一个存放内部娃娃的尺寸之和,当遇到自己的相反数时,则弹出,否则压入;
有一些测试数据可能存在空行,或者两个数据间存在多个空格,\n之前有多个空格等;
但是我的OJ上没有这么刁钻,没有考虑这些也AC了;
代码:
#include <cstdio>
#include <stack>
#include <string.h>
using namespace std;
int cur[100000];
stack<int> toy;
stack<int> size;
int main(){
int x = 0;
char c;
while (scanf("%d%c", &cur[x++], &c) != EOF){
if (c != '\n')
while (scanf("%d%c", &cur[x++], &c) && c != '\n'){}
if (x % 2 != 0){
printf(":-( Try again.\n");
x = 0;
memset(cur, 0, sizeof(cur));
continue;
}
bool f = true;
for (int i = 0; i < x; i++) {
if (cur[i] < 0){
toy.push(cur[i]);
size.push(0);
}
else if (cur[i] == -toy.top()){
toy.pop();
if (size.top() >= cur[i]){
f = false;
break;
}
size.pop();
if (!size.empty()){
size.top() = size.top() + cur[i];
}
}
else{
f = false;
break;
}
}
if (f)
printf(":-) Matrioshka!\n");
else
printf(":-( Try again.\n");
if (!toy.empty())
toy.pop();
if (!size.empty())
size.pop();
x = 0;
memset(cur, 0, sizeof(cur));
}
return 0;
}