洛谷-UVA514 铁轨 Rails

我会带着你远行 2023-05-29 06:43 115阅读 0赞

题目描述

PDF

format_png

输入格式

format_png 1

输出格式

format_png 2

题意翻译

某城市有一个火车站,铁轨铺设如图。有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。你的任务是判断是否能让他们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。 为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每节车厢,一旦从A移入C,就不能返回A了;一旦从C移入B,就不能返回C了。也就是说,在任意时刻,只有两种选择:A到C和C到B。

对于每一组数据,第一行是一个整数 N。接下来若干行数据,每行 N 个数,代表 1 ~ N 车厢的出栈顺序,最后一组数据只有一个整数 0 。对于每一组数据,在最后输出空行。

最后一组数据的 N=0 ,不输出。

n<=1000

输入输出样例

输入 #1复制

  1. 5
  2. 1 2 3 4 5
  3. 5 4 1 2 3
  4. 0
  5. 6
  6. 6 5 4 3 2 1
  7. 0
  8. 0

输出 #1复制

  1. Yes
  2. No
  3. Yes

标准答案:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxsize=1000+5;
  4. int n,B[maxsize];
  5. int main()
  6. {
  7. while(cin>>n&&n)
  8. {
  9. while(1)
  10. {
  11. int i=1,j=1;
  12. cin>>B[1];
  13. if(!B[1])
  14. break;
  15. for(int i=2;i<=n;i++)
  16. cin>>B[i];
  17. stack<int>s;
  18. while(i<=n)
  19. {
  20. if(i==B[j])
  21. {
  22. i++;
  23. j++;
  24. }
  25. else
  26. s.push(i++);
  27. while(!s.empty()&&s.top()==B[j])
  28. {
  29. j++;
  30. s.pop();
  31. }
  32. }
  33. if(j<=n)
  34. cout<<"No"<<endl;
  35. else
  36. cout<<"Yes"<<endl;
  37. }
  38. cout<<endl;
  39. }
  40. return 0;
  41. }

自己的答案:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int n;
  5. int A[1000];
  6. int B[1005];
  7. while(cin>>n&&n!=0){
  8. while(true){
  9. cin>>B[0];
  10. if(B[0]==0){
  11. break;
  12. }
  13. //B出栈序号
  14. for(int i=1;i<n;i++){
  15. cin>>B[i];
  16. }
  17. //A依次进站
  18. for(int i=0;i<n;i++){
  19. A[i]=i+1;
  20. }
  21. //模拟A出栈、B进栈(也就是出栈顺序)
  22. int b=0; //B栈初始下标
  23. stack<int> stack; //C中转栈
  24. for(int i=0;i<n;i++){
  25. //A出栈(可能入C,可能入B)
  26. if(A[i]!=B[b]){
  27. stack.push(A[i]);
  28. }else{
  29. b++;
  30. }
  31. //判断是否可从C出栈到B
  32. while(!stack.empty()&&stack.top()==B[b]){
  33. stack.pop();
  34. b++;
  35. }
  36. }
  37. //判断C栈是否为空
  38. if(stack.empty()){
  39. cout<<"Yes"<<endl;
  40. } else{
  41. cout<<"No"<<endl;
  42. }
  43. }
  44. cout<<endl;//不加这里测试用例不通过
  45. }
  46. return 0;
  47. }

发表评论

表情:
评论列表 (有 0 条评论,115人围观)

还没有评论,来说两句吧...

相关阅读

    相关 UVA 514——Rails

    题意:给定两个序列A和一到n的排列B,问能否通过一个栈的push和pop操作使得A变成B。 思路:直接构造一个栈模拟即可,注意换行。 code: