UVa 11111 & POJ 3195 - Generalized Matrioshkas

来源:互联网 发布:windows 自动点击 编程 编辑:程序博客网 时间:2024/06/07 12:14

传送门 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);        }    elseif (doll.empty() || doll.top().value != -wawa.value)//如果栈空或者没有匹配的, 错误.return false;elsedoll.pop();//成功匹配, 出栈.return true;}                   


0 0
原创粉丝点击