zoukankan      html  css  js  c++  java
  • PAT1051:Pop Sequence

    1051. Pop Sequence (25)

    时间限制
    100 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

    Output Specification:

    For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.

    Sample Input:
    5 7 5
    1 2 3 4 5 6 7
    3 2 1 7 5 6 4
    7 6 5 4 3 2 1
    5 6 4 3 7 2 1
    1 7 6 5 4 3 2
    
    Sample Output:
    YES
    NO
    NO
    YES
    NO

    思路
    栈的应用。这里直接用vector模拟栈,不得不说vector太强大了,既可以当栈又可以当队列用。

    这道题需要理清楚弹出序列不满足的条件:
    1.压进去数字后的栈容量大于限定的容量。
    2.弹出序列需求的弹出元素不在栈顶。

    简单过程:
    1.用一个bool值isSuccess来标识弹出序列是否可行,默认为true。
    2.保存第一次压入操作的最大元素cur,然后遍历弹出序列:
    1)如果弹出序列的当前元素temp比当前最大元素cur小,则它必须等于此时的栈顶元素top,否则要想得到和temp一样的值,就得不停弹出top,直到top == temp,但显然这样已经和弹出序列不匹配了,不可行,isSuccess置为false。
    2)如果temp比最大元素cur更大,则把cur + 1和temp之间的元素压入栈中,并检查此时栈容量是否超过要求,超过表明该序列也不可行,isSuccess置为false。
    3.遍历完弹出序列后,根据标识isSuccess的值输出YES or No即可。
    代码
    #include<iostream>
    #include<vector>
    using namespace std;
    
    int main()
    {
         int N,M,K;
         while(cin >> M >> N >> K)
         {
             vector<int> stk;
             while(K--)
             {
               bool isSuccess = true;
               int curmax = 1;
               stk.push_back(1);
               for(int i = 1; i <= N;i++)
               {
                   int temp;
                   cin >> temp;
                   if(temp > curmax)
                   {
                       for(int j = curmax + 1; j <= temp;j++)
                        stk.push_back(j);
                       if(stk.size() > M)
                       {
                           isSuccess = false;
                       }
                       curmax = temp;
                   }
                   else
                   {
                       if(stk.back() != temp)
                     {
                       isSuccess = false;
                     }
                   }
                   stk.pop_back();
               }
                if(isSuccess)
                    cout << "YES" << endl;
                else
                    cout << "NO" << endl;
             }
         }
    }
     
  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/0kk470/p/7623098.html
Copyright © 2011-2022 走看看