[洛谷] T137252 火车编组

本文介绍了货运火车在编组站的编组过程,通过栈操作模拟编组操作。题目要求给出一组车厢编号,实现从原始顺序到目标顺序的编组操作序列。问题转化为找出正确的进栈和出栈序列,保证最终车厢顺序符合要求。解决方案是利用两个变量跟踪进站和出站状态,确保每次出栈的车厢编号小于或等于即将进栈的车厢编号。

题目背景

题目描述

货运火车要在编组站根据挂靠车厢到达目的地重新分组。如果一列火车有4节车厢,经过编组后,车厢的编组顺序为3,2,4,1,你知道编组站是怎么编组的吗?

小明到编组站参观后发现,编组站的铁路有很多岔道,火车在岔道上来来回回地开动,最后列车编组就完成了。

小明想到学习过的栈操作,发现火车编组的过程就是由若干进栈、出栈操作构成的。于是,小明编了一个程序,只要知道最后的编组要求,就能将编组方案输出。

输入格式

第1行1个正整数n,n≤100;

第2行n个小于或等于n的正整数,表示有n节车厢,编号为1,2,3,…,n,编组时按照编号进栈,第2行数据表示列车经过编组后的车厢编号顺序。

数据保证一定有解。

输出格式

一行一个由大写字母A和B构成的字符串,A表示进栈,B表示出栈。表示编组时进栈出栈的操作序列

输入输出样例

输入 #1复制

4
3 2 4 1

输出 #1复制

AAABBABB

说明/提示

样例解释:

操作如下:

A 1进栈

A 2进栈

A 3进栈

B 3出栈

B 2出栈

A 4进栈

B 4出栈

B 1出栈

所以按照AAABBABB的方式,可以把1到n的入栈序列变成3 2 4 1的出栈序列

[思路]

题目中要求,火车进站的编号是1,2, 3...n。而出战的编号如果是3,2,4, 1的话。第一个出站的火车是3.那么这样火车一定要把1,2,3先入站,即如果一个火车出站一定要保证比该火车编号小的火车一定要进站。

由此,我们使用2个变量,一个变量用来标识当前准备入站的火车编号,一个变量指向出站中当前出战的火车。如果出站的火车编号大于进站的火车编号,说明火车站中还没有该编号的火车,既然没有该编号的火车,自然是不能出站的。所以一定要该编号的火车先进站,直到该火车入站。然后才可以出站该火车。这时出站的火车变量指向下一个出站的火车。按照前面的规则继续判断。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
const int N = 105;
stack<int> st;
int n;
int a[N];
int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
    }


    int idx = 1;
    int x = 1;
    while(1) {
        if( idx > n) break;
        if( st.empty() ) {
            st.push(x++);
            cout << "A";
        } else {
            if(a[idx] == st.top()) {
                idx++;
                st.pop();
                cout << "B";
            } else if( a[idx] > st.top()) {
                st.push(x++);
                cout << "A";
            }
        }
    }
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值