题目背景

给你一迭薄煎饼,请你写一个程式来指出要如何安排才能使这些薄煎饼由上到下依薄煎饼的半径由小到大排好。所有的薄煎饼半径均不相同。

要把薄煎饼排好序需要对这些薄煎饼做翻面(flip)的动作。方法是以一抹刀插入一迭薄煎饼中,然后做翻面的动作(也就是说在抹刀上面的薄煎饼经翻面后,会依相反的次序排列)。若一迭共有n个薄煎饼,我们定义最底下的薄煎饼的位置为1,最上面的薄煎饼位置为n。当抹刀插入位置为k时,代表从位置k到位置n的薄煎饼要做翻面的动作。

一开始时,这迭薄煎饼随意堆放,并以半径大小来表示。例如:以下3迭薄煎饼(最左边那一迭8是最上面一个薄煎饼的半径)

 8           7           2
4 6 5
6 4 8
7 8 4
5 5 6
2 2 7

对最左边那迭薄煎饼,如果我们把抹刀插在位置3(就是半径为7的那块薄煎饼的下面)的地方做翻面,就会得到中间那迭,如果我们再把抹刀插在位置1(就是半径为2的那块薄煎饼的下面)的地方做翻面,就会得到最右边那迭。

Input

每组测试资料一行,内容为这一迭薄煎饼一开始的状态。每列开始的整数(介于1到100之间)代表位于最上方薄煎饼的半径,依此类推。薄煎饼的数目介于1到30之间。请参考输入样例。

Output

对每一组测试资料输出2列。第一列为原来那迭薄煎饼。第2列则为要使这迭薄煎饼由小到大排列所做的翻面的动作。数字代表抹刀所插入的位置。(0代表已完成)。如果已经排好了,则不需再有翻面的动作。请参考输出样例。

输入输出样例

输入

1 2 3 4 5
5 4 3 2 1
5 1 2 3 4

输出

1 2 3 4 5
0
5 4 3 2 1
1 0
5 1 2 3 4
1 2 0

题解

采用选择排序的思想,按从大到小的顺序依次把元素移动到正确位置。不过这里我们只能翻转一个序列,故我们需要用到一个技巧,就是先将待选的元素“翻”到最左端,然后再将它“翻”到正确位置。

while True:
try:
A = list(map(int, input().strip().split()))
t = A.copy()
res = []
n = len(A)
# 排序趟数
for i in range(n):
max_v = max(A[: n - i])
max_i = A[: n - i].index(max_v)
if max_i != n - i - 1:
if max_i != 0:
A[: max_i + 1] = list(reversed(A[: max_i + 1]))
res.append(n - max_i) # 先翻到最上面
A[: n - i] = list(reversed(A[: n - i]))
res.append(i+1) # 再翻到正确位置
res.append(0)
print(" ".join(map(str, t)))
print(" ".join(map(str, res)))
except EOFError:
break

UVa120 煎饼(选择排序思想)的更多相关文章

  1. 选择排序 思想 JAVA实现

    已知一个数组 9.29.95.47.79.37.18.56.96.22 使用选择排序是数组有序 选择排序同样是一个运行时间为O(N²)的排序算法. 算法思想:(以从小到大为例) 9.29.95.47. ...

  2. 【uva 120】Stacks of Flapjacks(算法效率--构造法+选择排序思想)

    题意:有N张正在锅里的一叠煎饼,每张都有一个数字,代表其大小.厨师每次可以选择一个数k,把从锅底开始数第k张上面的煎饼全部翻过来,即原来在上面的煎饼现在到了下面.要求设计一种方法使得所有煎饼按照从小到 ...

  3. Java实现选择排序

    选择排序思想就是选出最小或最大的数与第一个数交换,然后在剩下的数列中重复完成该动作. package Sort; import java.util.Arrays; public class Selec ...

  4. C++中的冒泡排序,选择排序,插入排序

    最简单的插入排序:思想,两两之间比较,时间复杂度o(n^2) void bubblesort(vector<int>&vec, int n) { if (&vec==NUL ...

  5. [Java算法] -- 1. 常用排序之冒泡排序和选择排序

    使用Java语言实现冒泡排序和选择排序 推荐一个数据结构可视化的网站:http://zh.visualgo.net/zh (暂时访问不了) 对排序不太熟悉的朋友,建议去上面的网站学习一下,你将会发现一 ...

  6. 算法之LOWB三人组之选择排序

    选择排序 思想是在一个列表中每次循环一遍,拿到最小值,接着再从剩下的无序区中继续拿最小值,如此循环,直到结束. 时间复杂度为O(n^2) # 最简单的一个选择排序,循环一个列表,拿到最小值,添加到一个 ...

  7. 选择排序:直接选择排序&堆排序

    上一篇中, 介绍了交换排序中的冒泡排序和快速排序, 那么这一篇就来介绍一下 选择排序和堆排序, 以及他们与快速排序的比较. 一.直接选择排序 1. 思想 在描述直接选择排序思想之前, 先来一个假设吧. ...

  8. 八大排序算法~简单选择排序【记录下标k变量的作用】

    八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...

  9. 经典排序算法之-----选择排序(Java实现)

    其他的经典排序算法链接地址:https://blog.csdn.net/weixin_43304253/article/details/121209905 选择排序思想: 思路: 1.从整个数据中挑选 ...

随机推荐

  1. 温故知新,DotNet Core SDK和.Net CLI十八般武艺

    简介 .NET命令行接口 (CLI) 工具是用于开发.生成.运行和发布.NET应用程序的跨平台工具链. https://docs.microsoft.com/zh-cn/dotnet/core/too ...

  2. explicit 关键字 禁止隐式转换

    explicit可以抑制内置类型隐式转换,所以在类的构造函数中,使用explicit关键字,防止不必要的隐式转换

  3. Cobra框架使用手册

    cobra框架使用手册 cobra是go语言的一个库,可以用于编写命令行工具. 概念 Cobra 结构由三部分组成:命令 (commands).参数 (arguments).标志 (flags).最好 ...

  4. 触宝科技基于Apache Hudi的流批一体架构实践

    1. 前言 当前公司的大数据实时链路如下图,数据源是MySQL数据库,然后通过Binlog Query的方式消费或者直接客户端采集到Kafka,最终通过基于Spark/Flink实现的批流一体计算引擎 ...

  5. Algorithm:MD5算法原理说明

    MD5算法实现: 输入:不定长度信息(要加密的信息) 输出:固定长度128-bits.由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值. 基本方式为:求余.取余.调整长度.与链接 ...

  6. linux添加用户并授权访问目录

    1.创建用户及访问目录 useradd test -d /data/app -M设置密码passwd test 将访问目录权限全部赋予用户chown -R test /data/app2. 创建组(如 ...

  7. java 语言知识

    1.javase 标准版主要用于桌面应用.控制台:javaee 企业版主要用于web应用:javame微缩版主要用于嵌入式. 2.jre是java程序的运行环境,包含jvm(java虚拟机).jdk是 ...

  8. Spring cloud中相关的工具和库

    spring:      是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. spring mvc:                   spring集成的mvc开发框架. spring ...

  9. STM32笔记三

    1.单片机有两种存储器,程序存储器用来存储编写的程序,数据存储器用来存储单片机工作时的临时数据.内部存储器分为工作寄存器区.位寻址区.数据缓存区和特殊功能寄存器区. 2.位:数据存储的最小单位.在计算 ...

  10. php-18个魔法函数

    目录 php魔法函数 介绍 范例 1.__construct() 2.__destruct() 3.__call() 4.__callStatic 5.__get() 6.__set() 7.__is ...