【NC14326】Rails

news2024/11/23 2:59:39

题目

Rails

翻译

由于原题是英文的,所以这里先翻译一下:

PopPush市有一个著名的火车站。那里的山地多得令人难以置信。这个车站建于上个世纪。不幸的是,当时资金极为有限。只能建立一条地面轨道。此外,事实证明,火车站只能是一条死胡同(见图),而且由于空间不足,它只能有一条轨道。在这里插入图片描述
当地的传统是,每一列从 A A A 方向出发的火车都会以某种方式重组车厢,继续驶向 B B B 方向。假设从 A A A 方向出发的火车有 N < = 1000 N <= 1000 N<=1000 节车厢,车厢编号依次为 1 、 2 、 … , N 1、2、…, N 12N。列车重组负责人必须知道是否有可能指挥继续往 B B B 方向行驶的列车,使其顺序为 a 1 , a 2 , … , a n a_1, a_2,…,a_n a1,a2,an。帮他写一个程序,判断是否有可能得到所需的车厢序列。你可以假设单节车厢可以在进站前与列车断开连接,它们可以自己移动,直到到达 B B B 方向的轨道上。你也可以假设在任何时候,车站内可以有任意多节车厢。但是,一旦一辆列车进入车站,它就不能回到 A A A 方向的轨道上,而且一旦它离开车站,它也不能回到 B B B 方向。

输入描述

输入由行块组成。除了最后一个块之外,每个块描述了重组的一个序列,可能还有更多的输入。在第一行中,有上面描述的整数 N N N。在区块的每一行中都有 1 、 2 、 … n 1、2、…n 12n 的排列。块的最后一行只包含 0 0 0
最后一个块只有一行包含 0 0 0

输出描述

输出包含与输入中具有排列的行相对应的行。如果可以按输入的相应行所需的顺序对车厢进行编组,则输出中包含 Yes。否则包含No。此外,每块后面有一个空行,对应输入的一个块。在输出中没有对应于输入的最后一个块的行。

思路

虽然题目说了那么多,但归结起来就是一个数据结构基本问题:

给你一个入栈序列 p u s h e d pushed pushed 和一个出栈序列 p o p e d poped poped,判断 p o p e d poped poped 能否由 p u s h e d pushed pushed 经过出栈入栈得到

相信学过数据结构的人对这个并不陌生,学到栈这一章时就基本都是这个问题,但是纸面上的题是用人的思维来判断,动手模拟一下出栈入栈就行了,并且数据量也不大。那怎么用算法解决呢?

首先定义一个栈 s t k stk stk,并定义一个指针 t t t,其初始位置为出栈序列的起始位置,然后遍历入栈序列,先将当前元素入栈,入栈之后循环判断当前栈顶元素是否等于指针 t t t 所指的出栈序列中的元素,如果相等则将栈顶元素出栈,并将指针 t t t 后移一个位置;如果栈为空或者不相等,则继续遍历入栈序列,并重复上面步骤,直至入栈序列遍历完成。此时判断栈 s t k stk stk 是否为空,如果为空,则说明入栈序列经过入栈出栈操作可以得到出栈序列,否则不能。

注意这道题数据输入输出的要求,有点奇怪但是并不复杂,一步一步按要求读入再判断即可。

代码

#include <stdio.h>

#define N 1005

// 栈和栈顶指针
int stk[N], top;

/**
 * @brief 验证序列 b 是否是合法的栈输出序列
 *
 * @param b
 * @param n
 * @return int
 */
int check(int* b, int n) {
    top = 0;
    int t = 0;
    for (int i = 1; i <= n; i++) {
        stk[top++] = i;
        while (top && stk[top - 1] == b[t]) {
            top--;
            t++;
        }
    }
    return !top;
}

int main(void) {
    int n = 0, a[N], i = 0, flag = 0;
    while (~scanf("%d", &n) && n) {
        if (flag) {
        	// 如果不是第一块则先输出空行
            printf("\n");
        } else {
        	// 是第一块就不用输出空行,这样能保证最后一块的后面没有空行
            flag = 12138;
        }
        while (~scanf("%d", a) && a[0]) {
        	// 读入数据
            for (i = 1; i < n; i++) {
                scanf("%d", a + i);
            }
            // 判断序列是否合法
            printf("%s\n", check(a, n) ? "Yes" : "No");
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PurpleKeep:提供Azure管道以创建基础设施并执行Atomic测试

关于PurpleKeep PurpleKeep是一款功能强大的安全测试自动化工具&#xff0c;该工具能够通过提供Azure管道以创建基础设施&#xff0c;并帮助广大研究人员执行Atomic测试。 随着攻击技术种类的迅速增加&#xff0c;以及EDR&#xff08;端点检测和响应&#xff09;和自定义检测规…

[leetcode] 637. 二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,11.00000] 解释&#xff1a;第 0 层的平均值…

FMEA引领智能家居安全革新,打造无忧智能生活新纪元!

在智能家居日益普及的今天&#xff0c;如何确保家居安全成为消费者关注的焦点。本文将探讨如何通过FMEA&#xff08;故障模式与影响分析&#xff09;这一强大的质量管理工具&#xff0c;为智能家居赋能&#xff0c;打造安全无忧的智能生活新体验。 一、FMEA在智能家居领域的应用…

Electron的学习

目录 项目初始化可以看官网非常详细根路径创建.vscode文件夹主进程和渲染进程之前的通信ipcRenderer.send和ipcMain.on的使用ipcRenderer.invoke和ipcMain.handle的使用 切换主题模式文件拖放保存消息通知进度展示图标闪烁自定义菜单自定义右键菜单 项目初始化可以看官网非常详…

基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境

本文介绍了一项新工具&#xff0c;可以基于Gitops手动或者自动实现Kubernetes集群应用测试&#xff0c;确保集群的健康状态与Git仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD Testkube 简介&#xff1a;GitOps 云原生测试面临的挑战 现代云原生应…

Qt中出现中文乱码的原因以及解决方法

Qt专栏&#xff1a;http://t.csdnimg.cn/C2SDN 目录 1.引言 2.原因分析 3.源文件的编码格式修改方法 4.程序内部使用的默认编码格式修改方法 5.QString转std::string的方法 6.总结 1.引言 在编写Qt程序的时候&#xff0c;或多或少都可能遇到用QString时候&#xff0c;明明…

游戏APP如何提高广告变现收益的同时,保证用户留存率?

APP广告变现对接第三方聚合广告平台主要通过SDK文档对接&#xff0c;一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀&#xff0c;导致APP被封控&#xff0c;设置列入黑名单&#xff0c;借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…

51单片机入门:认识开发板

认识开发板 板载资源&#xff1a; 数码管模块 说明&#xff1a; 2个四位一体共阴数码管 详细&#xff1a; 2个四位一体&#xff1a;两个独立的四位数码管&#xff0c;每个四位数码管都是“一体”的设计&#xff0c;也就是说&#xff0c;每个数码管内部集成了四个独立的七段LE…

Stable Diffusion WebUI 附加功能/图片放大(Extras):单张图片/批量处理/从目录进行批量处理

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 篇文章主要讲解 Stable Diffusion WebUI 的附加功能/图片放大&#xff08;Extras&#xff09;的使用&#xff0c;主要…

JAV八股--redis

如何保证Redis和数据库数据一致性 关于异步通知中消息队列和Canal的内容。 redisson实现的分布式锁的主从一致性 明天继续深入看这个系列问题 介绍IO复用模型

WebSocket用户验证

在WebSocket中&#xff0c;如何携带用户的验证信息 一、在OnMessage中进行验证 客户端在连接到服务器后&#xff0c;客户端通过发送消息&#xff0c;服务器端在OnMessage方法中&#xff0c;进行信息验证&#xff0c;这种方式需要将用户身份验证及接收用户消息进行混合处理&am…

什么是原生IP?原生IP的作用是什么?

原生IP&#xff08;Native IP&#xff09;是指直接从互联网服务提供商&#xff08;ISP&#xff09;获得的IP地址&#xff0c;而非通过代理服务器、VPN或其他中间层方式获取。这种IP地址直接与用户的设备或网络关联&#xff0c;无需经过任何中间服务器或代理的转发或隐藏&#x…

体验OceanBase 的binlog service

OceanBase对MySQL具备很好的兼容性。目前&#xff0c;已经发布了开源版的binlog service工具&#xff0c;该工具能够将OceanBase特有的clog模式转换成binlog模式&#xff0c;以便下游工具如canal、flink cdc等使用。今天&#xff0c;我们就来简单体验一下这个binlog service的功…

Educational Codeforces Round 163 (Rated for Div. 2) E. Clique Partition

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

MacBook 访达使用技巧【mac 入门】

快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它&#xff0c;因为我不常用访达的搜索窗口&#xff0c;更多的是想快速打开访达文件夹窗口&#xff0c;可以通过第三方软件定义访达的快…

测开——Java、python、SQL、数据结构面试题整理

一、Java 1.Java中finally、final、finalize的区别 1.性质不同 &#xff08;1&#xff09;final为关键字; &#xff08;2&#xff09;finalize()为方法; &#xff08;3&#xff09;finally为为区块标志,用于try语句中; 2. 作用 &#xff08;1&#xff09;final为用于标识…

【通信原理笔记】【三】模拟信号调制——3.2 双边带抑制载波调制(DSB-SC)

文章目录 前言一、DSB-SC的数学表示二、DSB-SC的相干解调三、DSB-SC的性能评价总结 前言 从这一篇开始我们依次介绍几种模拟信号调制的方法&#xff0c;包括其数学表达式&#xff0c;系统框图、解调方式、性能评价等。 一、DSB-SC的数学表示 将 m ( t ) m(t) m(t)作为已调信号…

前端、后端上传文件到OSS,简明记录

前端、后端上传文件到OSS&#xff0c;简明记录 上传文件到oss的方式&#xff1a; **后端上传&#xff1a;**文件先要从页面上传到后端存起来&#xff0c;再通过后端发送到oss&#xff0c;然后后端将存起来的文件删除&#xff08;当然可以不删&#xff09;。 **前端上传&…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

4-Linux实用操作

1. 各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux 某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键 ctrl c 命令输入错误&#xff0c;也可以通过快捷键 ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2 ctrl …