题目名称 1227. 排序代价
输入输出 sillysort.in/out
难度等级
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 1
题目来源 Gravatar王者自由 于2012-10-26加入
开放分组 全部用户
提交状态
分类标签
排序
分享题解
通过:13, 提交:25, 通过率:52%
GravatarAlan 100 0.000 s 0.17 MiB Pascal
Gravatar毕之 100 0.000 s 0.17 MiB Pascal
Gravatar赵赵赵 100 0.001 s 0.17 MiB Pascal
GravatarEzoi_XY 100 0.001 s 2.67 MiB C++
Gravatar毕之 100 0.006 s 0.17 MiB Pascal
Gravatar0 100 0.007 s 0.30 MiB C++
GravatarEzoi_XY 100 0.007 s 0.31 MiB C++
Gravatar2279544550 100 0.008 s 0.33 MiB C++
Gravatar苏轼 100 0.009 s 0.18 MiB Pascal
Gravatarsqyon 100 0.009 s 2.70 MiB C++
关于 排序代价 的近10条评论(全部评论)
楼上上题解看不懂
GravatarHzoi_
2016-02-27 09:07 3楼
ls题解看不懂
GravatarEzoi_XY
2014-11-03 19:25 2楼
分析
考虑由两两交换完成的排序过程。可以想见,对每组输入数据,存在一个划分,使该划分中每个含m个元素的子集在基于原序列的顺序的两两对换的意义下生成一个m阶置换群。取一个划分X,使得其中的每个子集S在置换群意义上是极小的,即,对任意m < card(S),不存在S的含m个元素的子集,使其元素可以以同样方式生成一个置换群。
考虑任意S的排序过程。
定理1 对于单一的置换群G对应的子集(card(S) > 1),将其通过两两对换排序的最小“排序代价”为:
Sum + (N-2) X LocalMin
其中,sum为G对应子集S的所有元素的和,N = card(S),LocalMin为S的最小元素。
当然,当S中只有一个元素时,其排序代价为0.
证明:
1. 存在一种排序方案,其代价为上述公式的值。
考虑由两两对换形成的循环,每次交换最小元及其相邻元即可。
2. 最优性。
任意排序方案,其最低兑换次数为N-1,且这N-1次对换须移动S的所有元素。则这一方案的最小代价即为上述公式的值。
当数据被分为多个子集时,排序可能引入外部元素。
定理2 当引入外部元素时,G(card(S) > 1)的最小“排序代价”为:
Sum’ + (N-2) X GlobalMin + 2*(GlobalMin + LocalMin)
其中,Sum’ = Sum – LocalMin + GlobalMin;
GlobalMin 为输入数据中的最小元素。
证明:
1. 存在一种引入外部元素的排序方案,其代价为上述公式的值。
将外部最小元GlobalMin 与内部最小元LocalMin对换,再将其与剩余内部元素组成的数据按照定理1的方式排序,最后再次将GlobalMin与LocalMin对换即得。
2. 最优性。
任意引入外部元素的排序方案,与定理1类似地,其最低代价为上述公式的值。
由上述公式,如果被排序的子集包含全局最小元,则任意引入外部元素的排序方案都将具有大于内部最优方案的排序代价。是以定理1与定理2给出公式的最小值为待排序子集的最小排序代价。在上述划分方式下,原问题的解具有局部最优性,是以对每个子集的最小排序代价做和即得原问题的最优解。
From
<风和凌释>http://blog.sina.com.cn/arkpku
Gravatar超级傲娇的AC酱
2013-11-28 13:34 1楼

1227. 排序代价

★   输入文件:sillysort.in   输出文件:sillysort.out   简单对比
时间限制:1 s   内存限制:128 MiB

【问题描述】

有一列数,要对其进行排序(升序)。排序只能通过交换来实现。每次交换,可以选择这列数中的任意两个,交换他们的位置,并且交换的代价为这两个数的和。排序的总代价是排序过程中所有交换代价之和。现要求计算,对于任意给出的一列数,要将其排成升序所需的最小代价。

【输入】

输入包含多组数据。每组数据有两行组成。第一行一个数n,表示这列数共有n个数组成。第二行n个互不相同的整数(都是小于1000的正整数),表示这列数。输入文件以n=0结尾。

【输出】

对于每组输入数据,输出组号和排序所需的最小代价。

【样例】

sillysort.in

3

3 2 1

4

8 1 2 4

5

1 8 9 7 6

6

8 4 5 3 2 7

0

sillysort.out

Case 1:4

Case 2:17

Case 3:41

Case 4:34