zoukankan      html  css  js  c++  java
  • UVa 11111 Generalized Matrioshkas

    嵌套玩具, 要求外层玩具的尺寸比内层玩具尺寸的和要大. 每一个玩具由一个负数与相应的正数表示, 在这两数之间的部分即为此玩具内部的玩具. 要求判断一串输出的数字是否能组成一个合法的玩具. 一个合法的玩具:
    1. 数字代表了 toy 的尺寸大小.
    2. 外层的 size 必须 > 内层 size 的和, 不能是 >=.
    3. 每次必须是负正对一起出现.

     

    思路:

    用一个结构体代表玩具,成员变量为容量和内部和(即嵌套在内部的元素和)

    负数:

    1. 如果压栈元素大于外层容量,失败
    2. 计算外层的内部和,如果内部和大于容量,也失败
    3. 否则可以压栈

    正数:

    1. 出栈并判断是否匹配

    最后,如果栈为空,则成功

     

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<stack>
    #include<algorithm>
    #include<sstream>
    using namespace std;
    
    struct toy
    {
            toy(int value, int inner_sum):v(value), sum(inner_sum) {}
            //容量
            int v;
            //内部和
            int sum;
    };
    
    bool solve(string & line)
    {
            //cout<<line<<endl;
            istringstream iss(line);
            int x;
            stack<toy> st;
            while(iss>>x)
            {
                    //小于0压栈
                    if(x<0)
                    {
                            x=abs(x);
                            //非最外层
                            if(!st.empty())
                            {
                                    //内层大于外层
                                    if(st.top().v<x)
                                            return false;
                                    //统计内层的元素和,如果大于等于外层容量,返回失败
                                    st.top().sum+=x;
                                    if(st.top().sum>=st.top().v)
                                            return false;
                            }
                            st.push(toy(x, 0));
                    }
                    //大于0弹栈,并判断是否匹配
                    else 
                    {
                            if(st.empty())
                                    return false;
    
                            int y=st.top().v; st.pop();
                            if(x!=y)
                                    return false;
    
                    }
            }
    
            return st.empty();
    }
    
    
    int main()
    {
            string line;
            while(getline(cin, line))
            {
                    if(solve(line))
                            cout<<":-) Matrioshka!"<<endl;
                    else
                            cout<<":-( Try again."<<endl;
    
            }
    
        return 0;
    }
  • 相关阅读:
    Windows Phone 开发——相机功能开发
    IE8 margin:0 auto 不能居中显示的问题
    YUI Compressor JS和CSS压缩工具使用方式(使用前安装JDK)
    Javascript日常编码中的一些常见问题
    NODESCHOOL
    js动态加载css和js
    JS this用法详解
    getElementsByTagName( )方法
    js 停止事件冒泡 阻止浏览器的默认行为(比如阻止超连接 # )
    跨浏览器的事件对象
  • 原文地址:https://www.cnblogs.com/cute/p/3615659.html
Copyright © 2011-2022 走看看