蓝桥杯2021年第十二届省赛-双向排序
蓝桥杯2021年第十二届省赛真题-双向排序 - C语言网 (dotcpp.com)
题解参考:
12届蓝桥杯省赛c++b组 I题 双向排序_thejohn2020的博客-CSDN博客_蓝桥杯双向排序https://blog.csdn.net/qq_51972900/article/details/116453220代码部分见上方题解。
根据题意,0是降序,1是升序;
显而易见的是,
1.当上一步操作是【0,a】,这一步操作是【0,b】,且 时,相当于b没操作,当时,相当于a的操作被覆盖掉了。两个 0降序 操作,只执行 更大的数 的操作。
例如:123456789这个序列,先执行【0,6】,序列变为654321789,后执行【0,4】,序列不变;先执行【0,4】,序列变为432156789,后执行【0,6】,序列变为654321789,相当于只要执行【0,6】;
2.当上一步操作是【1,a】,这一步操作是【1,b】,且 时,相当于a被覆盖,当时,相当于b被覆盖。两个 1升序 操作,只执行了 更小的数 的操作。
例如:987654321这个序列,先执行【1,6】,序列变为987651234,后执行【1,4】,序列变为987123456;先执行【1,4】,序列变为987123456,后执行【1,6】,序列不变;
3.如果第一个操作是【1,y】,原本就是升序,相当于没操作。所以开头遇到1操作就扔掉它。
那么,当0和1的交换操作时应该怎么办?
先不回答上面的问题,我们先看如下的这么一个情况:
Q:现在有【1,2,3,4,5,6,7,8,9】这样的序列,你遇到了如下操作命令(从上到下执行),请输出交换后得到的序列。
(0,9) |
(1,1) |
(0,7) |
(1,4) |
(0,6) |
首先观察以下这些指令,第一条指令是【0,x】,0和1的指令是交替的,以0开头的指令是排列的顺序是降序的,以1开头的指令是升序的;
之后我们一步步来执行这些指令,
操作【0,9】:987654321
操作【1,2】:912345678
操作【0,7】:965432178
操作【1,4】:965123478
操作【0,6】:965321478
最终结果是:965321478
但是在一步步执行的过程中可以看到,因为操作【0,x】中的x在变小,操作【1,y】的y在变大,所以序列中数字不断能变化的区域是在变小的(紫色的区域是已经固定的部分,黑色的区域是还可以变化的部分)
那么,为什么紫色区域是已经固定的了?
前置信息:因为肯定是0操作开头的,1操作的前面肯定是0操作,所以每次到1操作时,最左边的部分肯定已经是逆序的了。
先看左边那块紫色的已经被固定的部分,因为指令【1,y】中的y是不断变大的,所以 1操作 能把数字拉回来的 能力范围变小了,于是不在1的范围里面的数字(根据前置信息,这些数字肯定是逆序)就被留在了左边;
同理,指令【0,x】中的x不断变小,不在0的范围里面的数字(因为0操作的前面肯定是1,所以右边那部分肯定是升序)就被留在了右边;
于是回到之前的问题,
当0和1的交换操作时应该怎么办?
——把【0,x】和【1,y】的操作命令按照先来后到的顺序x递减,y递增 ,下面是当前命令是x的情况,(y的情况同理):
如果 新来的 比之前来的(这里的是x1的上方的上方,因为0和1是交替排序的) 小,那么它加入,如果新来的 比 之前来的x 大,那么新来的【0,】向上找,直到【0,】成为第一条命令,或者找到了比 还要大的,那么在【0,】的下方(这里的下方是【1,y】的位置,因为0和1是交叉排序的)的下方 插入【0,】,同时 【0,】下方的所有指令都被覆盖掉了。
例如把下面的操作排序成上面表格里的操作序列:
1 3
1 6
0 2
1 7
0 9
1 8
1 1
0 4
1 7
0 5
1 5
0 7
1 5
1 4
0 6
假设现在已经把命令全都排好了,要如何操作已经排好了的命令呢?
【0,9】:987654321
【1,2】:912345678
【0,7】:965432178
【1,4】:965123478
【0,6】:965321478
可以从这个例子中看到,如果当前是0操作,那么从右侧固定(从大到小还没有被固定的)数字,到【0,x】的x右边停下;如果当前是1操作,那么从左侧固定(从大到小还没有被固定的)数字,到【1,y】中y的左边停下;
如果操作命令都执行完了,中间的数字还没被填满,那么最后一条操作是0(降序),那么中间的数字从左往右填上从大到小的数字;最后一条操作是1(升序),那么从右往左填上从大到小的数字。
蓝桥杯2021年第十二届省赛-双向排序相关推荐
- 蓝桥杯2021年第十二届省赛-杨辉三角形
蓝桥杯2021年第十二届省赛真题-杨辉三角形 - C语言网 (dotcpp.com)https://www.dotcpp.com/oj/problem2610.html 参考: 2021第十二届蓝桥杯 ...
- C++ | 蓝桥杯2021年第十二届卡片问题(源代码:C语言/C++/Python)
================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...
- 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛程序设计试题以及详细题解
原题展示 通读本试题后,可以知本试题所涉及到的模块有LCD显示.LED指示.按键切换.串口收发.定时器的PWM输出五个部分,试题的总体变化不大.在试题要求的所有功能中,串口这部分是侧重点,它既 ...
- 第十二届蓝桥杯2021年C++A组省赛题解
文章目录 注 考生须知 试题A:卡片 试题B:直线 题解 代码(set + map) 试题C:货物摆放 题解 代码 试题D:路径 题解 代码 试题E:回路计数 题解 代码 试题F:砝码称重 题解 代码 ...
- 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛客观题及详细题解
题1 解析: 波特率,指每秒钟传输码元符号的个数,对符号传输速率的一种度量,单位为1baud/s. 由于串口只有高低电平之分,即1码元等于1bit,即波特单位1baud和1bit等效,因此,此时的波特 ...
- [蓝桥杯]2019年第十届省赛真题C/C++ B组 填空+大题
第十届蓝桥杯省赛题目 填空A:组队 填空B:年号字串 填空C:数列求值 填空 D: 数的分解 填空 E: 迷宫 大题F:特别数的和 大题G:完全二叉树的权值 大题H:等差数列 大题I-后缀表达式 填空 ...
- 题目 2311: 蓝桥杯2019年第十届省赛真题-Fibonacci 数列与黄金分割
题目 Fibonacci 数列是非常著名的数列: F[1] = 1,F[2] = 1, 对于 i > 3,F[i] = F[i − 1] + F[i − 2] Fibonacci 数列有一个特殊 ...
- 【STM32G4】备战蓝桥杯嵌入式---实战---第十二届嵌入式模拟赛
文章目录 前言 一.题目 功能简述 二.模块初始化以及功能分析 1.模块的初始化 2.模块功能分析 三.函数实现 1.void Display(void); 2.uint8_t KEY_Scan(ui ...
- 蓝桥杯2019年第十届国赛真题-大胖子走迷宫
题目 题目链接 题解 BFS. 整体思路:将位置信息和时刻信息放入队列,根据时刻信息判断当前时刻小明的大小,如果大小为1×11×11×1则不能原地停留,因为没意义啊,停留是为了让自己的肚子减小,但是1 ...
- 蓝桥杯2021届C++B组省赛真题 杨辉三角形
分析: 1. 首先他要我们找第一次出现N的位置,我们可以发现杨辉三角是两边完全对称的,在右边出现的在左边一定先出现过,所以N只可能出现在左半边,我们将右半边删去 2. 这道题的数据规模特别大,那么我们 ...
最新文章
- 教育部:建设100+AI特色专业,500万AI人才缺口要补上!
- Codeforces Beta Round #11 A. Increasing Sequence 贪心
- jeecms内容管理系统使用了哪些技术
- Quartz.Net 学习之路02 初探Quartz.Net
- 材料成型计算机模拟第三版,材料成型计算机模拟实验报告模板学习.doc
- 单身的原因终于找到了!原来是这几个......
- Android中的savedInstanceState
- 一张网络路由器与能源路由器对照表(2015年)
- Unity 3D 入门小游戏 小球酷跑(上)
- 为出海掘金创造更多可能 助力开发者触达全球用户
- PHP执行底层机制-zend详解
- BLDC无刷直流电机
- Dreamweaver 8 时间轴及创建时间轴动画(转)
- [BJDCTF2020]Mark loves cat详细解法与思路
- 小米4电信4G_2014716_官方线刷包_救砖包_解账户锁
- oracle判断if函数,ORACLE判断奇偶数函数
- 解决IntelliJIdea许可证过期,输入许可证认证不成功
- bert-pytorch版源码详细解读
- 期货开户每日无负债结算制度
- C++的this指针【定义、用法、本质、特点】