车厢调度(栈的经典入门题)

车厢调度

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)

Total Submission(s) : 5   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

有一个火车站,每辆火车从A驶入,车厢可以停放在车站C中,或从B方向驶出。假设从A方向驶来的火车有n节(n<=1000),分别按照顺序编号为1,2,3,...,n。假定在进入车站前,每节车厢之间都不是连着的,并且它们可以自行移动到B处的铁轨上。另外,假定车站C可以停放任意多节车厢。但是一旦进入车站C,它就不能再回到A方向的铁轨上了,并且一旦当它进入B方向的铁轨,它就不能再回到车站C。

负责车厢调度的工作人员需要知道能否使它以a1,a2,...,an的顺序从B方向驶出,请来判断是否能得到指定的车厢顺序。

Input

输入有多组数据,每组数据的第一行为一个整数n,其中n<=1000,表示有n节车厢,第二行为n个数字,表示指定的车厢顺序。

Output

如果可以得到指定的车厢顺序,则输出一个字符串YES,否则输出NO。

Sample Input

5

5 4 3 2 1

Sample Output

YES

根据栈的特点来判断是否是一个合法的序列,最开始驶出的要么不经过中转直接到B,要么到中转里面,以A代表驶入的序列,B为驶出序列的下标。

数组模拟:

#include<cstdio>
const int maxn = 1000 + 10;
int target[maxn],stack[maxn];
int main()
{
    int n,i;
    while(scanf("%d",&n)==1)
    {
        for(i=1;i<=n;i++)
            scanf("%d",&target[i]);
        int ok=1,A=1,B=1;
        int top=0;
        while(B<=n)
        {
            if(A==target[B]) {A++,B++;}
            else if(top&&stack[top]==target[B]) {top--,B++;}
            else if(A<=n) stack[++top]=A++;
            else {ok=0;break;}
        }
        printf("%s\n",ok ? "Yes":"No");
    }
    return 0;
}

STL:

#include<cstdio>
#include<stack>
using namespace std;
const int maxn = 1000 + 10;
int target[maxn];
int main()
{
    int n,i;
    while(scanf("%d",&n)==1)
    {
        stack<int>s;
        for(i=1;i<=n;i++)
            scanf("%d",&target[i]);
        int ok=1,A=1,B=1;
        while(B<=n)
        {
            if(A==target[B]) {A++,B++;}
            else if(!s.empty()&&s.top()==target[B]) {s.pop(),B++;}
            else if(A<=n) s.push(A++);
            else {ok=0;break;}
        }
       printf("%s\n",ok ? "Yes":"No");
    }
    return 0;
}
时间: 2024-10-14 01:29:34

车厢调度(栈的经典入门题)的相关文章

二分答案经典入门题:)

LuoguP1024  一元三次方程求解 题目传送门 因为根与根之间的差不超过1,所以我们就可以分段枚举,又已知根的取值范围是[-100,100],于是就很简单啦QWQ xiu-代码走起-- 1 #include<cstdio> 2 double a,b,c,d; 3 double count(double x){//计算函数值 4 return a*x*x*x+b*x*x+c*x+d; 5 } 6 int main(){ 7 double l,r,mid,x1,x2; 8 int tot=0

SPOJ375 Query on a tree经典入门题

剖分边更新,线段树点更新区间求极值.学树链剖分感觉还是先做点更细的好,而不是边更新.其实最主要还用来维护的数据结构了,剖分基本上都成模板了. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 const int m

栈的合理出栈顺序(列车厢调度)

列车厢调度 一道较为明显的栈的可能出栈顺序的变式题,2是栈,3是出栈序列,很水一道变式应用 1 ====== <--移动方向 / 3 ===== 2 ====== -->移动方向 大家或许在某些数据结构教材上见到过"列车厢调度问题"(当然没见过也不要紧).今天,我们就来实际操作一下列车厢的调度.对照上方的ASCII字符图,问题描述如下: 有三条平行的列车轨道(1.2.3)以及1-3和2-3两段连接轨道.现有一列车厢停在1号轨道上,请利用两条连接轨道以及3号轨道,将车厢按照要

1357:车厢调度 (栈)

[题目链接] http://ybt.ssoier.cn:8088/problem_show.php?pid=1357 [算法] 栈模拟调度操作,一个指针指向入栈队列,如果出栈的编号大于指针指向的则指针后移并且车厢入栈,若小于且在栈头则出栈,反之序列不可行. [代码] 1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,i,puz; 4 int a[1010],b[1010],tot,p=1; 5 int main() 6 { 7

【软帝学院】12道java经典入门算法题!

12道java经典入门算法题! [程序1]   题目:将一个数组逆序输出. 程序分析:用第一个与最后一个交换. 其实,用循环控制变量更简单: for(int k=11;k>=1;k--) System.out.print(myarr[k]+","); [程序2]   题目:取一个整数a从右端开始的4-7位. 程序分析:可以这样考虑: (1)先使a右移4位. (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) (3)将上面二者进行&运算. pu

12道java经典入门算法题!

12道java经典入门算法题![程序1] ? 题目:将一个数组逆序输出. ? 程序分析:用第一个与最后一个交换. ? 其实,用循环控制变量更简单:for(int k=11;k>=1;k--)System.out.print(myarr[k]+","); [程序2] ? 题目:取一个整数a从右端开始的4-7位. ? 程序分析:可以这样考虑: ? (1)先使a右移4位. ? (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) ? (3)将上面二者进行&a

网络流最经典的入门题 各种网络算法都能AC。

Drainage Ditches 题目抽象:给你m条边u,v,c.   n个定点,源点1,汇点n.求最大流.  最好的入门题,各种算法都可以拿来练习 (1):  一般增广路算法  ford() 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string&g

车厢调度

(train.cpp/c/pas) Description 有 一 个 火 车 站 , 铁 路 如 图 所 示 ,每辆火车从 A 驶入, 再从 B 方向驶出,同时它的车厢可以重新组合.假设 从 A 方向驶来的火车有 n 节(n<=1000) ,分别按照顺 序编号为 1,2,3,…,n.假定在进入车站前,每节 车厢之间都不是连着的,并且它们可以自行移动到 B 处的铁轨上. 另外假定车站 C 可以停放任意多节车厢. 但是一旦进入车站 C,它就不能再回到 A 方向的铁轨 上了,并且一旦当它进入 B 方

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

Xxy 的车厢调度(train.cpp/c/pas)Description有 一 个 火 车 站 , 铁 路 如 图 所 示 ,每辆火车从 A 驶入,再从 B 方向驶出,同时它的车厢可以重新组合.假设从 A 方向驶来的火车有 n 节(n<=1000) ,分别按照顺序编号为 1,2,3,…,n.假定在进入车站前,每节车厢之间都不是连着的,并且它们可以自行移动到 B处的铁轨上. 另外假定车站 C 可以停放任意多节车厢.但是一旦进入车站 C,它就不能再回到 A 方向的铁轨上了,并且一旦当它进入 B 方