2821 天使之城

2821 天使之城

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题目描述 Description

天使城有一个火车站,每辆火车都从A方向驶入车站,
再从B方向驶出车站。

为了调度火车,火车站设有停放轨道,可存放5辆火车。已知从A进入车站顺序为1、2、3……。现在给你一个调度方案,判断是否可行,如果可行,输出出站顺序。
有以下几种调度方法:
A. 将A上的头一辆车驶出B方向
B. 将A上的头一辆车停入暂停轨道
C. 将暂停轨道上最外面的车驶出B方向

输入描述 Input Description

输入第一行一个整数N(n<30)表示调度方案步骤数目。
下一行一个字符串,有N个大写字母,表示调度方法。

输出描述 Output Description

输出若不可行(暂停站满了还停车、暂停站空了还出车),则输出一行“No”。
若可行,输出一行“Yes”,再输出若干行,每行一个整数,表示车出站序列。

样例输入 Sample Input

[样例输入1]
6
ABBCCA
[样例输入2]
5
BACAC

样例输出 Sample Output

[样例输出1]
Yes
1
3
2
4
[样例输出2]
No

数据范围及提示 Data Size & Hint

如题

 1 1 #include<iostream>
 2  2 #include<cstdio>
 3  3 using namespace std;
 4  4 int stack[10100],a[1000],top=0;
 5  5 int main()
 6  6 {
 7  7     int i,n,b=1,j=1,k=1; //j是输出数组的参数,k是列车号
 8  8     char s;
 9  9     cin>>n;
10 10     for(i=1;i<=n;++i)
11 11     {
12 12         cin>>s;
13 13         if(s==‘A‘)  //输入A时
14 14         {
15 15             a[j]=k;++j;k++;  //a【】为输出的数组,因为A是火车来了接着就走,k号车接着就走
16 16         }
17 17         if(s==‘B‘)  //输入B时
18 18         {
19 19             stack[++top]=k;++k;  //将K号列车停入暂停轨道,放入栈
20 20         }
21 21         if(s==‘C‘)
22 22         {
23 23             a[j]=stack[top];  //压出栈顶的
24 24             top--;if(top>5||top<0)b=0;
25 25             ++j;
26 26         }
27 27     }
28 28     if(b)
29 29     {
30 30         cout<<"Yes"<<endl;
31 31         for(int k=1;k<j;++k)
32 32         cout<<a[k]<<endl;
33 33     }
34 34     else cout<<"No";
35 35     return 0;
36 36 }
时间: 2025-01-14 18:10:58

2821 天使之城的相关文章

Codevs 2821 天使之城

2821 天使之城 时间限制: 1 s 空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 天使城有一个火车站,每辆火车都从A方向驶入车站,再从B方向驶出车站. 为了调度火车,火车站设有停放轨道,可存放5辆火车.已知从A进入车站顺序为1.2.3…….现在给你一个调度方案,判断是否可行,如果可行,输出出站顺序.有以下几种调度方法:A. 将A上的头一辆车驶出B方向B. 将A上的头一辆车停入暂停轨道C. 将暂停轨道上最外面的车驶出B方向 输入描述 Inpu

天使之城(codevs 2821)

2821 天使之城 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 天使城有一个火车站,每辆火车都从A方向驶入车站,再从B方向驶出车站. 为了调度火车,火车站设有停放轨道,可存放5辆火车.已知从A进入车站顺序为1.2.3…….现在给你一个调度方案,判断是否可行,如果可行,输出出站顺序.有以下几种调度方法:A. 将A上的头一辆车驶出B方向B. 将A上的头一辆车停入暂停轨道C. 将暂停轨道上最外面的车驶出B方向

CODEVS 必做题:3149、2821、1531、3369、1230

3149 爱改名的小融 2 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名.现在他的要求变了,只要是英文字母就是他的名字.先给你N个名字,请你一一判断是不是小融.本题还加强了测试数据 输入描述 Input Description NN行名字(全部为字符) 输出描述 Output Description N行,YES或NO(大写) 样例输入 Sample Input 3&6*14315

C++ 数据结构之栈

栈作为最常用的数据结构之一,一直是算法竞赛中最基础的的内容,但是它和递归一起算是初学者的噩梦,我在此也就秉着复习知识加造福新人的初衷,写一篇关于栈的基础详解. 栈也叫后进先出表,LIFO表,其实可以想象成一摞书,先搁上去的会被压在最底下,而最上面的书却是最后摞上去的. 这样讲还是比较抽象,我这里附图解释吧: 首先原始的栈中元素从下至上为“2,7,1”,而执行“压入8”之后最上层多了一个元素“8”,而后的push(2)则同理.执行pop()会弹出最上层的元素,执行三次后栈中元素还剩下“2,7”.

BZOJ 2821: 作诗(Poetize)( 分块 )

分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0.5) ----------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<

bzoj 2821 分块

分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其答案已经计算得到,左右两边加起来最多有2*len个元素,暴力计算其对答案的影响.O(q*len*f(n)),f(n)是暴力加入一个元素的代价. 这道题f(n)是log(n) 总的复杂度:f(n) = O( n*n/len + q*len*log(n) ), 当len = n*(q*log(n))-1

[BZOJ 2821] 作诗(Poetize) 【分块】

题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i 个块到第 j 个块的出现次数为偶数的数的个数. 这个复杂度是 n * (n / x) 的. 然后把数与位置存在结构体里,按照数字第一关键字,位置为第二关键字排序.这样是为了方便之后二分查找 [l, r] 中 Num 出现了几次. 对于每次询问,先把答案加上中间包含的整块的答案.然后对于两边至多 2

BZOJ 2821作诗(Poetize) 分块

Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i][j]表示第i块到第j块的答案,并记录块的前缀数的出现次数. f[i][j]直接暴力算,块的前缀数的出现次数也可以直接算,都是nsqrt(n). 遇到询问x y,中间答案的块可以直接统计,然后再暴力统计左右两边零碎的贡献,也是nsqrt(n). Code 1 #include <cstdio> 2

BZOJ 2821 作诗

类似上题的做法,f[i][j]表示第i块到第j块出现偶数次的数有多少个,然后调整一下. 复杂度n√nlogn. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define maxn 100050 using namespace std; int n,c,m,a[maxn],cnt[maxn],blo[maxn]