UAa514 例题6-2 铁轨 Rails
2017-07-24 16:49
225 查看
原题链接: UVA-514
题目大意:
某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1-n.你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶入车站。例如,出栈顺序(54 1 2 3)是不可能的,但是(5 4 3 2 1)是可能的。
解题思路:
看完《算法竞赛入门经典》上给的题目之后,不是特别明白,就又找原题看了看。看的时候一开始以第一念头就是暴力求出所有的可能性,然后在进行比较。使用栈是肯定的了。后来仔细想想太麻烦,而且很有可能超时,就放弃了。然后看了看刘汝佳的代码又结合着别的小伙伴的思路。恍然大悟,A推B不好推,那就B推A.
大致思路就是(内容取自上面的小伙伴):
从A->C和从C->B,例如要求顺序是[5,4,1,2,3],A中的原顺序是[1,2,3,4,5],那么接下来有两个操作,如果B要求的第一个等于A中的第一个,那么直接从A->B,否则
如果C的栈顶等于B要求的第一个,那么C->B
如果都不是,那么只能A->C了
如果以上都不成立,也就是说A里面已经没有数据了,那说明该要求顺序是不可能出现的
代码:
#include <iostream> #include <stack> using namespace std; const int maxn = 1000 + 10; int crg[maxn]; int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int n,sign=0; while (cin >> n && n) //读入车厢个数 { while (cin >> crg[1] && crg[1]) //如果读入为0,则说明对该列火车的判断结束 { stack<int> station; for (int i = 2; i <= n; i++) { cin >> crg[i]; } int A, B, ok; A = B = ok = 1; while (B <= n) { if (A == crg[B]) //A位置的车厢可以直接到B { A++; B++; } else if (!station.empty() && station.top() == crg[B]) //B位置的车厢正是C栈顶元素 { B++; station.pop(); } else if (A <= n) //A,C 位置均没有与B对应的车厢,则应该先进站 { station.push(A); A++; } else //以上欠款均不符合,A处已经没有车厢 { ok = 0; break; } } if (ok) cout << "Yes" << endl; else cout << "No" << endl; } cout << endl; } return 0; }
相关文章推荐
- 例题6-2 UVA 514 - Rails (铁轨)
- 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514)
- 经典第六章 例题 6-2 UVA 514 Rails(栈的基础应用)
- Uva514 Rails(铁轨)
- UVA 514 铁轨 (Rails)
- 算法竞赛入门经典第六章例题6-2 Rails UVA - 514
- UVA514 Rails(铁轨)
- 铁轨Rails UVA514(stack运用)
- UVa514 Rails(铁轨)
- 铁轨Rails UVA514(stack运用)
- UVA 514 Rails 铁轨 栈的模拟
- 铁轨(Rails,ACM/ICPC CERC 1997.UVa 514)
- UVa514-Rails-铁轨--栈的使用
- stack&&UVa514 Rails (铁轨)的理解与解析
- 【例题 6-2 UVA - 514】Rails
- UVa 514 Rails(铁轨) 栈
- UVA514:Rails(铁轨)
- Uva Oj 514 - Rails
- 【栈】例题6-2 UVa 514
- 【栈】UVA - 514 Rails