• GRYZ 模 拟 赛 系 列 Xxy 的车厢调度


    Xxy 的车厢调度
    (train.cpp/c/pas)
    Description
    有 一 个 火 车 站 , 铁 路 如 图 所 示 ,每辆火车从 A 驶入,
    再从 B 方向驶出,同时它的车厢可以重新组合。假设
    从 A 方向驶来的火车有 n 节(n<=1000) ,分别按照顺
    序编号为 1,2,3,…,n。假定在进入车站前,每节
    车厢之间都不是连着的,并且它们可以自行移动到 B
    处的铁轨上。 另外假定车站 C 可以停放任意多节车厢。
    但是一旦进入车站 C,它就不能再回到 A 方向的铁轨
    上了,并且一旦当它进入 B 方向的铁轨,它就不能再
    回到车站 C。
    负责车厢调度的 xxy 需要知道能否使它以
    a1,a2,…,an 的顺序从 B 方向驶出,请来判断能否得到
    指定的车厢顺序。
    Input
    输入文件的第一行为一个整数 n,其中 n<=1000,表示有 n 节车厢,第二行为 n 个数字,表
    示指定的车厢顺序。
    Output
    如果可以得到指定的车厢顺序,则输出一个字符串”YES”,否则输出”NO”(注意要大写,不
    包含引号) 。还有,xxy 说了 这题 AC 有糖吃。
    Example
    train.in train.out
    5
    5 4 3 2 1
    YES
    Hint
    对于 50%的数据,1<=N<=20。
    对于 100%的数据,1<=N<=1000。

    思lu:这个栈不会上溢,所以不能成立的原因只有当要出车1的时候上边有车2等阻拦;

    Top作为栈顶所以当B数组为当前需要top到达的车的位置,stack[top-1]==0&&top!=b[i])||top-1==b[i]时top—若top最后==车则本次可以成立不等则判断否return

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<string>
     6 using namespace std;
     7 int b[1003];
     8 int top=1,n;
     9 bool flag=false;
    10 int stack[1003];
    11 void mdzz()
    12 {
    13     for(int i=1;i<=n;i++)
    14     {
    15         if(top<b[i])
    16         {
    17             while(top != b[i])
    18             {
    19              top++;
    20             }
    21         stack[b[i]]=0;    
    22         }
    23         else if(top>b[i])
    24         {
    25             while((stack[top-1]==0&&top!=b[i])||top-1==b[i])
    26             {
    27                 top--;
    28             }
    29             if(top!=b[i])
    30             {
    31                 flag=true;
    32                 return;
    33             }
    34             else stack[b[i]]=0;
    35         }
    36         
    37     }
    38 }
    39 int main()
    40 {
    41     freopen("train.in","r",stdin);
    42     freopen("train.out","w",stdout);
    43     scanf("%d",&n);
    44     for(int i=1;i<=n;i++)
    45     {
    46         stack[i]=1;
    47         scanf("%d",&b[i]);
    48     }
    49     mdzz();
    50     if(flag==1)printf("NO");
    51     else printf("YES");
    52     fclose(stdin);
    53     fclose(stdout);
    54     return 0;
    55 }
  • 相关阅读:
    STL--sort源码分析
    进程和线程的区别
    static 关键字 静态成员变量及静态成员函数
    二叉树遍历总结 先序、中序、后续、广度、深度
    C++用new和不用new创建类对象区别
    传输层--TCP和UDP的区别
    传输层的作用
    微信商户/H5支付申请 被拒原因:网站存在不实内容或不安全信息
    Oracle本地网络服务名配置
    存储过程常用技巧
  • 原文地址:https://www.cnblogs.com/sssy/p/6679640.html
Copyright © 2020-2023  润新知