zoukankan      html  css  js  c++  java
  • PAT 解题报告 1051. Pop Sequence (25)

     

    1051. Pop Sequence (25)

    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

    题目描述:

    一列数, 只能以1, 2, …., N的push 到stack里面, 但是可以再任意时刻pop出一个数字, 问给定一个序列, 是不是一个可行的按照这样的规则可以出现的一个pop序列.

    算法分析:

    思路:总结规律,使用hash

    使用hash记录已经弹出栈的数字

    从前向后扫,两种情况下是不可能的

    1、比如当前扫到了7,查看1~6是否已经弹出,若没有弹出的数量count<M(栈的容量),则说明不可能。

    2、比如当前扫到了7,而前一个是4,就要检测5和6是否弹出,如果有一个没弹出,则不可能

    注意点:

    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <iostream>
    
    using namespace std;
    
    int hashs[1002];
    int M, N, K;
    
    int getScale(int x){
        int cnt = 0;
        for (int i=1; i<=x; i++) {
            if (hashs[i] == 0)
                cnt++;
        }
        return cnt;
    }
    bool ckinv(int x,int y){
        for (int i=y+1; i<x; i++){
            if (hashs[i] == 0)
                return false;
        }
        return true;
    }
    
    int main()
    {
        scanf("%d%d%d", &M, &N, &K);
        for (int i=0; i<K; i++) {
            memset(hashs, 0, sizeof(hashs));
            int a[N+1];
            for (int j=1; j<=N;j++) {
                scanf("%d", a+j);
            }
            int pre;
            bool flag = true;
            for (int j=1; j<=N; j++) {
                int tmp = a[j];
                if (getScale(tmp) > M) {
                    printf("NO
    ");
                    flag = false;
                    break;
                }
                if (j!=1 && ckinv(pre, tmp)== false) {
                    printf("NO
    ");
                    flag = false;
                    break;
                }
                hashs[tmp] = 1;
                pre = tmp;
            }
            if (flag == true) printf("YES
    ");
        }
        return 0;
    }
  • 相关阅读:
    《Expert .NET 2.0 IL Assembler》 译者笔记 2
    游戏大厅升级日记 第2天
    《Metadata Tables》 Authors
    随便写写,蛮有趣的
    《Metadata Tables》 Introduction
    Oracle跨数据库的数据操作
    要换工作环境了
    javascript中几种操作打印的方法
    Datagrid中实现单选功能
    C#中利用Oracle事务删除表
  • 原文地址:https://www.cnblogs.com/549294286/p/3574279.html
Copyright © 2011-2022 走看看