UVA 11111-Generalized Matrioshkas(栈)

题意:有很多层盒子,盒子里面再套盒子,一个盒子可能套多个独立的子盒子,但子盒子的总体积必须小于该盒子,否则不合法,输入给一行数,负数代表左边,正数代表右边,大小表示其体积,如-2,-1,1,2则表示体积为2的盒子里套一个体积为1的盒子,再比如-5,-2,2,-1,1,5表示体积为5的盒子套两个盒子分别为2和1,题目要求判断给出的一行数是否合法。一定要保证子盒子的体积小于大盒子。比如-5,-4,4,-2,2,5就不合法。

解析:栈的使用,但同时维护另一个值,该盒子剩余能容纳的体积,比如该盒子的体积为5,已经有一个体积为3的盒子,减掉3后还剩2,如果还有子盒子,则子盒子的体积一定要小于2,否则不合法。

代码如下:

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
int go;
int my_stack[40000],leave[40000],elem[40000];  //栈,leave[]代表该盒子剩余容量
bool solve()
{
    int rear=0;
    memset(leave,0,sizeof(leave));
    leave[0]=INF;
    for(int i=0;i<go;i++)    //扫一遍
    {
        if(elem[i]<0)       //小于0则添加到栈中
        {
            rear++;
            my_stack[rear]=abs(elem[i]);
            leave[rear]=abs(elem[i]);                    //此时的leave[]就等于他的值
        }
        else
        {
            if(rear==0)  return false;                   //还未扫完就栈空
            if(elem[i]!=my_stack[rear])  return false;   //与栈顶元素不相同
            if(elem[i]>=leave[rear-1])  return false;     //大于或等于大盒子的leave[]
            leave[rear-1]-=elem[i];                       //减掉
            rear--;                                       //出栈
        }
    }
    return rear==0;                                       //最后还要判断是否栈空
}
int main()
{
    string line;
    while(getline(cin,line))
    {
        istringstream output(line);                        //字符串流输入,这样比较方便
        int a;
        go=0;
        while(output>>a)
        {
            elem[go++]=a;
        }
        if(go%2){ printf(":-( Try again.\n"); continue; }  //不是偶数肯定不合法
        if(solve())  printf(":-) Matrioshka!\n");
        else  printf(":-( Try again.\n");
    }
    return 0;
}
时间: 2024-08-09 18:26:57

UVA 11111-Generalized Matrioshkas(栈)的相关文章

uva 11111 - Generalized Matrioshkas

  Problem B - Generalized Matrioshkas  Vladimir worked for years making matrioshkas, those nesting dolls that certainly represent truly Russian craft. A matrioshka is a doll that may be opened in two halves, so that one finds another doll inside. The

ACM学习历程——UVA11111 Generalized Matrioshkas(栈)

Description Problem B - Generalized Matrioshkas   Problem B - Generalized Matrioshkas  Vladimir worked for years making matrioshkas, those nesting dolls that certainly represent truly Russian craft. A matrioshka is a doll that may be opened in two ha

UVa 11111 一般Matrioshka 及 scanf 处理一行

题目:nest,嵌套 思路:思路想通了其实很简单:将负数压栈,遇到输入正数时,检查栈顶元素,如果栈顶是正数,则出栈,一直检查栈顶元素直到栈顶是负数,判断该数和栈顶负数是否为相反数,并判断出栈的那些正数之和是否小于该输入的正数(这个是满足题目中的相加小于m的条件).如果满足,则栈顶负数出栈,输入的正数入栈.这样循环到最后,如果一直匹配则最后栈中只剩一个元素.    思路很清晰,但实现起来比较麻烦,主要是EOF和\n的判断.我一直以为scanf是不能用来辨别一行的,因为它会跳过空白符.看了别人的一篇

UVa 514 Rails(经典栈)

 Rails  There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time. It was possible to establish only a surface track. Moreover, i

Generalized Matrioshkas UVA 11111

说说: 题意就是一个大整数中包含几个小整数,且小整数的和要大于大整数.同时小整数中也可能包含其他小整数,依次类推.要求判断整个的包含关系是否正确.只是题目给的说明不是很清楚.首先给你一个序列,比如:-9     -7     -2    2     -3     -1     -2    2    1    3    7    9  其中9的范围就是-9到9之间,并且只包含了7.如果序列为-9 -7 7 -2 2 9 则9中就包含了7和2两个数字,显然这种情况是不合法的.解法的话,无非就是建立两

uva 10410 - Tree Reconstruction(栈)

题目链接:uva 10410 - Tree Reconstruction 题目大意:给定一个树的BFS和DFS,求这棵树. 解题思路:用栈维护即可.对应BFS序列映射出了每个节点和根节点的距离,遍历dfs序列,对当前节点和栈顶节点比较,如果该节点距离根节点更远,则说明该节点为栈顶节点个孩子节点,则记录后将节点放入栈中.否则弹掉栈顶元素继续比较.需要注意一点,即当元素与栈顶元素的距离值大1的时候要视为相等,因为它们属于兄弟节点 #include <cstdio> #include <cst

UVA - 514 Rails 经典栈使用

题目大意:有一列n节车厢的火车要入栈,车厢从1到n,只能从小到大入栈. 现在给出一个出栈顺序,问能否实现 解题思路:如果栈顶元素大于要出栈的数,肯定就不能实现了. 如果栈顶元素小于要出栈的数,就继续入栈 如果栈定元素等于要出栈的数,就出栈 #include<cstdio> #include<algorithm> #include<stack> using namespace std; #define maxn 1010 int num[maxn], n; void so

UVA - 11234 - Expressions (栈和队列)

UVA - 11234 Expressions Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description 2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem E: Expressions Arithmetic e

UVa 514 Rails(模拟栈)

题意  n辆火车按顺序依次进站  判断给定的出战顺序是否可能 用数组模拟模拟栈代表车站  车依次进站  每当栈顶火车序号与当前要出站的b[cur] 相等时 就让栈顶元素出栈  即top-- #include<cstdio> #include<cstring> using namespace std; const int N = 2000; int b[N], c[N]; int main() { int l, cur, top; while(scanf("%d"