题意简述
现要对一个序列a进行排序,交换i,j的花费是a[i]+a[j],求对a排好序的最小花费。
数据
输入:
6
8 4 5 3 2 7
输出:
34
思路
我们来想土匪正解。
我们先把原数组(代码中是a)和排好序的数组(代码中是b)都写好,拿样例举例子:
然后你会发现我染了颜色。。。
那么,同样颜色的数有什么关系呢?
你会发现,在同一个颜色块里面的数字,只有内部排列错了, 不会影响外面 \color{red}\text{不会影响外面} 不会影响外面。
就比如红色的,
上面是8 2 7
下面是2 7 8
那么,在一个颜色块里面,我们有哪些方案呢?
有两种方案,一个是拿整个序列里面最小的数去一个一个交换归位(方案1),一个是拿该颜色块里面的最小的数去一个一个交换归位(方案2)。
比如:对于蓝色块,我们有两种方法:
法1 用块里面最小的和整个块换
交换3和5,然后交换3和4
也就是拿最小的那个去这个和整个序列换
当然我们珂以用DFS求出这个具体的方案,但实际上我们不必要知道的那么具体,只要知道总花费是(最小的+所有不是最小的),拆开也就是
(C-1)×最小+(所有不是最小的和),
即(C-2)×最小+块里面的总和
其中C表示块大小
法2 用整个序列最小的和整个块换
交换2和3,交换2和5,交换2和4,再把2和3换回来
一般来讲这种方法不太珂能更优,但也不是没有珂能,如果数据毒瘤的话不考虑就炸了
我不考虑这个只有10分
不难想到这种方法的总花费是
(总最小+块最小)+(总最小+块里面所有数),
即(总最小)×(C+1)+块里面的和+块最小
我们用C表示块大小,Sm(s&m)表示块里面的和,Mn表示块里面的最小,M表示总最小。
那么,枚举每个块,初始设置ans=0,显然(如果不显然请看上面)应该这么写:
a n s + = m i n ( S m + ( C − 2 ) × M n , M × ( C + 1 ) + S m + M n ) ans+=min(Sm+(C-2)\times Mn,M\times(C+1)+Sm+Mn) ans+=min(Sm+(C−2)×Mn,M×(C+1)+