洛谷 P2127 题解(贪心,并查集,乱搞,好题)

题意简述现要对一个序列a进行排序,交换i,j的花费是a[i]+a[j],求对a排好序的最小花费。数据输入:68 4 5 3 2 7输出:34思路我们来想土匪正解。我们先把原数组(代码中是a)和排好序的数组(代码中是b)都写好,拿样例举例子:然后你会发现我染了颜色。。。那么,同样颜色的数有什么关系呢?你会发现,在同一个颜色块里面的数字,只有内部排列错了,不会影响外面\co...
摘要由CSDN通过智能技术生成

题意简述

现要对一个序列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+(C2)×Mn,M×(C+1)+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值