算法基础-贪心

贪心

所谓贪心就是只做出当前情况下的最优选择,不考虑将来的思想方法。

显然,贪心是有可能出错的,因此我们需要在猜想贪心策略后去证明它(虽然我都是直接交(bushi))

证明方法

贪心算法有两种证明方法:反证法和归纳法。一般情况下,一道题只会用到其中的一种方法来证明。

  1. 反证法:如果交换方案中任意两个元素/相邻的两个元素后,答案不会变得更好,那么可以推定目前的解已经是最优解了。

  2. 归纳法:先算得出边界情况(例如 )的最优解 ,然后再证明:对于每个 , 都可以由 推导出结果。

邻项交换法

例题:

恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

思路:

 

 

反悔贪心

反悔操作指的是这一步的贪心不是全局最优解,我们就退回去一步(人工或自动判断),换一种贪心策略。按照判断方式的不同可以分为反悔自动机反悔堆两种方法。

反悔堆

即通过(大根堆、小根堆)来维护当前贪心策略的最优解,若发现最优解不对,就退回上一步,更新最优解。

由于堆的性质,使得堆的首数据一定是最优的,这就可以实现快速更新最优解

用时一定模型

USACO09OPEN 工作调度Work Scheduling

用优先队列的大小代表当前的用时

价值一定模型

[JSOI2007]建筑抢修

其实就是分为已选和未选两个组别,反别按不同贪心策略维护。上题就是未选组按deadline升序维护,已选组按用时降序排列,每次先看待选元素是否可以直接加入队列,若冲突则与耗时最长者比较,用时短者进入已选

反悔自动机

即设计一种反悔策略,使得随便一种贪心策略都可以得到正解。

基本的设计思路是:每次选择直观上最接近全局最优解的贪心策略,若发现最优解不对,就想办法自动支持反悔策略。(这就是自动机的意思)

具体题目具体分析。一般需要反悔自动机的题都是通过差值巧妙达到反悔的目的。

堆反悔自动机

CF865D Buy Low Sell High

最容易想到的贪心就是每次都搜索之前最小的配对,但是1,5,100,这样的就不对了,因此在将1和5配对后将1弹出,5压入,这样当后面出现更优的和1配对的选择时(这个选择一定比5大不然不会更优),他会和5配对,我们第一次+5-1,第二次+100-5,相当于没有选5,即撤销了先前的操作,反悔了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuhudaduizhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值