18.12.16 DSA 吉老师的汉诺塔

描述

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

输入

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

样例输入

15 21 3 10 8 5

样例输出

7

提示

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

题解

1 1 #include <iostream> 2 2 #include <string.h> 3 3 #include <algorithm> 4 4 #include <stack> 5 5 #include <string> 6 6 #include <math.h> 7 7 #include <queue> 8 8 #include <stdio.h> 9 9 #include <string.h> 1010 #include <vector> 1111 #include <fstream> 1212 #define maxn 100005 1313 #define inf 999999 1414 #define cha 127 1515 using namespace std; 1616 1717 int n; 1818 int plate[maxn], tmp[maxn]; 1919 long sum; 2020 2121 void mysort(int left,int right) { 2222 if (left >= right)return; 2323 int mid = (left + right) / 2; 2424 mysort(left, mid), mysort(mid + 1, right); 2525 int i = left, j = mid + 1, p = left; 2626 while (i <= mid && j <= right) { 2727 if (plate[i] >= plate[j]) 2828 tmp[p++] = plate[i++]; 2929 else { 3030 tmp[p++] = plate[j++]; 3131 sum += mid - i + 1; 3232 } 3333 } 3434 while (i <= mid) 3535 tmp[p++] = plate[i++]; 3636 while (j <= right) 3737 tmp[p++] = plate[j++]; 3838 for (int p = left; p <= right; p++) 3939 plate[p] = tmp[p]; 4040 } 4141 4242 void init() { 4343 scanf("%d", &n); 4444 for (int i = 1; i <= n; i++) 4545 scanf("%d", &plate[i]); 4646 mysort(1, n); 4747 printf("%ld\n", sum); 4848 } 4949 5050 int main() 5151 { 5252 init(); 5353 return 0; 5454 }

View Code

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

python刷题-数列排序

资源限制时间限制:1.0s内存限制:512.0MB问题描述  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<n<200输入格式  第一行为一个整数n。  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式  输出一行,按从小到大的顺序输出排序后的数列。样例输入583649样例输出34689···

python刷题-查找整数

问题描述给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。输入格式第一行包含一个整数n。第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。第三行包含一个整数a,为待查找的数。输出格式如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出1。样例输入61948399样例输