18.12.16 DSA 吉老师的汉诺塔

Wesley13
• 阅读 414

描述

吉老师的面前出现了一座汉诺塔!但是这个汉诺塔好像坏了,盘子并不是按照从大到小的顺序排列的……吉老师非常不开心,立志要把这个汉诺塔修好!吉老师每分钟可以交换挨在一起的两个盘子,吉老师希望用的时间最短,吉老师不会啊,你能帮帮吉老师吗?

输入

第一行1个整数N。
第二行为N 个非负整数,按从下到上的顺序给出每个盘子的大小。
对于50%的数据,2<=N<=1000。
对于100%的数据,2<=N<=100000。输出一个整数,表示最少需要交换多少次相邻的盘子才能将盘子递减排列。同样大小的盘子应该排在一起。

样例输入

5
1 3 10 8 5

样例输出

7

提示

吉老师经过多次尝试,发现最优情况下的每次交换中,一定是将小盘子放到大盘子的上面,这样它们就从逆序变成了顺序,而且只有这一对盘子从逆序变成了顺序,所以总共逆序的盘子对数恰好减少一。而当没有逆序的盘子时,汉诺塔就修好啦。

题解

18.12.16 DSA 吉老师的汉诺塔 18.12.16 DSA 吉老师的汉诺塔

 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <stack>
 5 #include <string>
 6 #include <math.h>
 7 #include <queue>
 8 #include <stdio.h>
 9 #include <string.h>
10 #include <vector>
11 #include <fstream>
12 #define maxn 100005
13 #define inf 999999
14 #define cha 127
15 using namespace std;
16 
17 int n;
18 int plate[maxn], tmp[maxn];
19 long sum;
20 
21 void mysort(int left,int right) {
22     if (left >= right)return;
23     int mid = (left + right) / 2;
24     mysort(left, mid), mysort(mid + 1, right);
25     int i = left, j = mid + 1, p = left;
26     while (i <= mid && j <= right) {
27         if (plate[i] >= plate[j])
28             tmp[p++] = plate[i++];
29         else {
30             tmp[p++] = plate[j++];
31             sum += mid - i + 1;
32         }
33     }
34     while (i <= mid)
35         tmp[p++] = plate[i++];
36     while (j <= right)
37         tmp[p++] = plate[j++];
38     for (int p = left; p <= right; p++)
39         plate[p] = tmp[p];
40 }
41 
42 void init() {
43     scanf("%d", &n);
44     for (int i = 1; i <= n; i++)
45         scanf("%d", &plate[i]);
46     mysort(1, n);
47     printf("%ld\n", sum);
48 }
49 
50 int main()
51 {
52     init();
53     return 0;
54 }

View Code

照搬了之前的作业求逆序对。提示说得很清楚,坑点在于答案超过了int范围

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
DaLongggggg DaLongggggg
3年前
python刷题-数列排序
资源限制时间限制:1.0s内存限制:512.0MB问题描述  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<n<200输入格式  第一行为一个整数n。  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式  输出一行,按从小到大的顺序输出排序后的数列。样例输入583649样例输出34689···
DaLongggggg DaLongggggg
3年前
python刷题-查找整数
问题描述给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。输入格式第一行包含一个整数n。第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。第三行包含一个整数a,为待查找的数。输出格式如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出1。样例输入61948399样例输
Stella981 Stella981
2年前
Day01——Python简介
一、Python简介python的创始人为吉多·范罗苏姆(GuidovanRossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承,Python通过C语言开发。TIOBE开发语言排名(20180117),python排名第四https:/
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Python 基础知识(一)
1.Python简介1.1、Python介绍     python的创始人为吉多·范罗苏姆(GuidovanRossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。  (龟叔:2005年加入谷歌至2012年,2013年加
Stella981 Stella981
2年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Wesley13 Wesley13
2年前
JAVA学习入门篇_递归结构
递归结构递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。​利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。​递归结构包括两个部分:​1.定义递归头。解答:什么
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这