您的位置:首页 > 移动开发 > IOS开发

UVa 11111 & POJ 3195 - Generalized Matrioshkas

2014-05-04 19:06 405 查看
传送门 UVa 11111 - Generalized Matrioshkas



一开始看了很久的题意, 看不懂. 后来参考了别人才知道是这么个意思..

跟括号匹配差不多, 一负一正就像一个 '(' 和一个')', 每个 ( 的下一级的总和不能超过这个 ( 的值.

所以题意就是给我们一坨数字, 负的数字只能和他的相反数匹配, 数字的后一级的和不能超过或者等于上一级. 

参考了MistKafka的思路, 做了一点小的修改... 不过就是这一点小的修改让我调试了一个小时......

引用一下他的思路. 

思路:用栈模拟,
遇到负数入栈; 正数则与栈顶匹配, 若匹配成功则消去栈顶 , 否则也入栈。栈的元素是结构体, 除了上面的括号自身的数值value外, 还有所有直接子括号的和sum。 在负数入栈前, 要把它的数值加到栈顶(如果empty就不用)的sum, 并判断, 判断完才能入栈。




详情见代码

#include <cstdio>
#include <stack>
using namespace std;

struct dolls
{
int sumBig;
int value;
dolls(int x)
{
sumBig = 0;
value = x;
}
};

stack<dolls> doll;
int big;
char ch;

bool Judge();

int main()
{
//freopen("input.txt", "r", stdin);
bool flag;
while (~scanf("%d%c", &big, &ch))
{
flag = Judge();
if (flag && ch == '\n' && doll.empty())	//如果是最后一个数字并且返回正确并且栈空
printf(":-) Matrioshka!\n");
else if (flag == false || ch == '\n' && !doll.empty())	//如果输入仅有一个数
{
printf(":-( Try again.\n");	//如果其中有一次返回错误, 那么这个输入就是错的, 这时候要处理剩下的输入.
while (!doll.empty())	//每次错误都要清空栈, 因为要读取新的输入.
doll.pop();
if (ch == '\n')	//当输入就一个数时, 这时候的ch就是'\n', 不能再消去了, 不然就得不到EOF或者下一行的正确数据, 这里搞了很久
continue;
while (getchar() != '\n');	//ch不是'\n', 消去,直到当前行的最后一个.
}
}
return 0;
}

bool Judge()
{
dolls wawa(big);
if (big < 0)
if (doll.empty())   //如果栈空, 直接进栈.
doll.push(wawa);
else
{
doll.top().sumBig += wawa.value;
if (doll.top().value >= doll.top().sumBig)
return false;
doll.push(wawa);
}
else
if (doll.empty() || doll.top().value != -wawa.value)	//如果栈空或者没有匹配的, 错误.
return false;
else
doll.pop();	//成功匹配, 出栈.
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM UVa POJ