acwing 算法基础班学习笔记-第六讲.贪心思想

贪心思想总结来说就是每步都选择当前最优的决策,最后也收敛到全局最优点,因此不是所有问题都能使用贪心思想,能用贪心思想解决的问题往往具有某种单调性。

一、区间问题:
1.区间选点 :给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。
思路:所有区间都在同一个数轴上,则显然有一定的单调性。将区间按右端点排序,则从小到大遍历每个区间的左端点,若小于上一个重叠区间的右端点,说明是可以加入集合的,则保持不变;若大于,则说明这个区间和上一个重叠区间无法重叠,因此需要新设置一个重叠区间,以当前区间的右端点作为边间。
2.最大不相交区间数量:实际算法同上,按右端点排序保证了重叠区间的单调性,后续的区间就不需要考虑之前的重叠区间的情况,因为如果能够下一个区间能和某重叠区间重叠,那么一定是先与当前的重叠区间重叠,因为当前重叠区间的右端点是最大的。而如果下一个区间不能和当前重叠区间重叠,那么一定也不能和之前的重叠区间重叠。
3.区间分组:给定 N 个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。输出最小组数。
思路:其实是求区间的厚度,可以把所有区间的左右端点记录下来(注意需要能够区分左右),按照从小到大排序,然后从最小的开始遍历,遍历到一个左端点即cnt++,遍历到一个右端点则cnt–,cnt则表示当前有多少个有交集的区间(显然每一个都需要单独分一组),过程中记录最大的cnt值,即为需要的最大分组数。
4.区间覆盖:给定 N 个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。输出最少区间数,如果无法完全覆盖则输出 −1。
思路:将区间按左端点排序(保证了每次只需遍历到最后一个左端点小于目标区间左端点的即可),每次用能覆盖区间左端点,且右端点在最右边的区间去覆盖(更新)目标区间,即将目标区间的左端点改成当前区间的右端点,则能保证所需的区间最少。

二、哈夫曼树:
思路:每次将两个最小的值合并成一个,则能保证最大的元素一定合并的次数最少。

三、排队打水:
思路:短进程优先的思想,将所需时间最短的放在最前执行。

四、货仓选址:
思路:放在全局的中心点时到各点的距离之和最短。若不在中心点,则可以在中心点左右找到一组点,他们到中心点的距离比到现在点的距离小。

五、推公式:
耍杂技的牛:可以发现交换任意相邻的两头牛,对其他牛的危险度没有影响,因此对比两头相邻的牛交换前后的危险度可以发现由于s, w都是正数,wi−si+1>−si+1, wi+1−si>−si比较wi−si+1, wi+1−si即可
当wi−si+1>=wi+1−si,即 wi+si>=wi+1+si+1时, 交换后更优当wi−si+1<wi+1−si,即 wi+si<wi+1+si+1时, 交换前更优。所以得到做法: 按每头牛的 w + s 进行排序,然后根据题意算出每头牛的危险值记录其中的最大值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值