• SOJ4478 Easy Problem II(模拟、栈)


    Time Limit: 3000 MS    Memory Limit: 131072 K

    
    

    Description

    
    
    在数据结构中 我们学习过 栈 这种数据结构
    通过栈 我们可以将1,2,3,...,n转化成一个新的排列
    
    举个例子
    1,2,3可以转变为2,1,3
    只要我们这样做
    将1加入栈中
    将2加入栈中
    出栈(此时出栈的为2)
    出栈(此时出栈的为1)
    将3加入栈中
    出栈(此时出栈的为3)
    故出栈顺序为2 1 3
    
    现在输入一个排列,我们要判断该排列能否被栈通过1,2,3,...,n 转化出来

    Input

    
    
    有多组数据
    第一行为n 代表输入数据的组数
    接下来n行 第一个数代表当前排列数字的个数m  接下来的数代表一个1-m的排列
    (1 小于  m  小于等于 50)

    Output

    
    
    对于每一组数据
    若该排列能通过栈转化1,2,3,...,n而来
    那么输出Yes
    否则输出No

    Sample Input

    
    
    4
    3 2 1 3
    2 2 1
    5 3 2 4 1 5
    3 3 1 2

    Sample Output

    
    
    Yes
    Yes
    Yes
    No

    思路:这一个题乍一看上去还是有一点蒙圈,因为很难使用现有的公式什么套用,如果DFS暴力去做,那么复杂度至少是在2^n的级别,面对n<=50的范围显然是不能接受的。所以在询问了大神以后确定这个题是一个模拟,我们只需要模拟栈的工作状态就可以把这个题做出来了。
      具体而言,我的方法是记录当前输出过的最大的数,如果后续输入的数是符合栈的运算规律的,由于初始队列是严格单调连续递增的,所以后续一共有两种情况,一是新输入的数比现在已经输入过的数的最大值还要大,二是新输入的数是比当前最大值小的数中的最大的没有被输出过的数。
      第一种情况是模拟了一次性压多个数入栈,之后再输出的情况,比如1 2 5 4 3。5比之前已经出现过的最大的数2要大,符合条件。第二种情况是模拟了,在将多个数压入栈以后,开始从栈里面拿出数输出的情况,比如前面的 1 2 5 4 3,当5输出以后,下一个输出的数是4和3的情况,因为初始状态下,数据是严格单调连续递增的,所以不会出现空过一个未输入最大值进行输出的情况。模拟即可。

    AC代码:
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    
    int num[55];
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            int n;
            cin>>n;
            int maxn,temp,flag=1;//maxn存储当前最大值,temp是为了临时存储每一次读入的数, flag是判断当前是否还处于合法输出状态 
            memset(num,0,sizeof(num));//初始化 
            cin>>temp;//第一次单独处理 
            maxn=temp;
            num[temp]++;
            for(int i=1;i<n;i++){
                cin>>temp;
                if(temp>maxn){
                    maxn=temp;
                    num[temp]++;
                }
                else{
                    for(int j=maxn;j>0&&flag;j--){
                        if(num[j]==0){
                            if(temp!=j){
                                flag=0;
                                printf("No
    ");
                                break;
                            }else{
                                num[temp]++;
                                break;
                            }
                        }
                    }
                }
                
            }
            if(flag==1)printf("Yes
    ");
        }
        return 0;
    } 
    
     
  • 相关阅读:
    每日英语:Surviving a Conference Call
    每日英语:Boost Your Balance; Avoid Falls
    每日英语:Proactive Advice for Dealing With Grief: Seek Out New Experiences
    每日英语:Tencent Fights for China's Online Shoppers
    每日英语:5 Things to Know About Missing Malaysia Airlines Flight and Air Safety
    每日英语:Does China Face a Reading Crisis?
    每日英语:Six Ways to Modernize Your Car
    每日英语:Welcome to the Global Middle-Class Surge
    阿里巴巴 Sentinel + InfluxDB + Chronograf 实现监控大屏
    SpringBoot 2.0 + InfluxDB+ Sentinel 实时监控数据存储
  • 原文地址:https://www.cnblogs.com/87hbteo/p/7283995.html
Copyright © 2020-2023  润新知