贪心-学习理解记录

本篇是在学习理解贪心的过程中留下的理解和记录,主要是通过几个题目来理解贪心的思路

想法思路

  1. 只顾眼前,但是却能得到最优解,让眼前的浪费是最小的
  2. 不能保证是唯一的最优解但是一定是最优解之一
  3. 直观地表示就是只考虑局部,每次都拿最合适的一个,最后得到的就一定是最优解,但是如果出现多种限制条件的话就需要综合考虑
题目一:一共有n个人,人的体重是w[i],船的上线重量是C,每条船最多是两个人,问最少几条船能把所有人装走

在这里插入图片描述

  1. 我们先将w(i)从小到大排序走一遍,当1是最轻的时候,他加2的重量还是比c大,那么说明至少有n条船,因为两个最轻的人都不能同船,那其他人就跟不可能在一起坐船了
  2. 然后我们的思路走到第i和第k个人同船,如果存在j比k重,但是j和i又同船不超载,那么我们就应该让i和j一起坐船,这就是当前局部的最优解
  3. 所以我们来回忆一下这题的解法,利用双指针,i从最轻的开始走,j从最重的往回走,j先走,当j和最轻的都做不了船的时候,就说明此时的j需要一个人坐船,j一直递减到第一个能和i坐船的情况,才会出现i+1的同时,j-1并且只多一条船的情况,之后就继续往下走就完事。
后续
总结:

这里的贪心思路就是从最轻的开始找,每次找都是找能同船的最大的重量,到最后结果的时候就会转化成最少需要几条船

题目二:区间问题,一条数轴上面有n个开区间(a(i),b(i)),选择尽可能多的点使得区间之间没有公共点
  1. 最多区间问题我们会考虑的多一点的就是,区间越小,有公共点的几率就越低,所以我们需要先按照b(i)的大小来递增排序,现在假设区间已经按照b(i)的大小排序好了(选左边界或者右边界都可以,具体就是判断当一个边界排序之后,另一个边界的相交问题),那么下面我们来考虑左边界的问题
  • a1>a2
    如下图所示,区域1被包含在区域2中,那按照贪心的策略直接拿最小的也就是b1
    在这里插入图片描述
  • 两个区域不存在交集也就是a2>b1
    这就不影响判断,直接把区域一拿进去就行
    在这里插入图片描述
  • a1<a2
    就是两个区域相交的情况,那就是二选一呗,因为不能有公共点,但是我们其实仔细一看,前面斜线的部分其实是不影响选择的,,已经在最前面了,选不选都不会影响到区间的个数(因为前面不可能有区间和他相交了),但是我们选区域二就会包含区域一,而且后面的部分还有可能和其他部分相交,所以我们还是得选区域一。
    在这里插入图片描述
  1. 我们拿到第一个区间之后,排除所有和区域一相交的区域,从下一个和区域一不相交的区域开始,重复刚才的操作继续确定下一个区域,最后扫描整个数轴就能完成贪心,得到最终的结果
后续
总结:

这里的贪心思路就是在每个不相交的区间内选一个最大的区间,当每次选择不相交最小的区间的时候就会得到最多的区间个数

题目三:区间选点问题:一条数轴,n个闭区间[a(i),b(i)],取尽量少的点使得每一个区间都至少包含一个点
  1. 假如区间i有点,那么所有包括区间i的区间都被满足。
  2. 还是先对所有的区间按照b(i)大小进行增序,当b(i)相同的时候,a(i)进行递减排序(这样如果碰到相同的我们直接计b(i)相同a(i)最大的一次就好了)
    在这里插入图片描述
  3. 接下来每次去找的时候就去找最小的区间,然后每次取点就是最小区间的最右点,把所有的有交集的区间都去除掉之后再去寻找下一个最小的区间,重复当前过程
总结:

这里的贪心思路就是获取每一个最小的区间来获得点,每次获得最小区间之后把右边所有相交的区间都删除,这样重复的操作

后续
题目四:交代任务,有n个部下,每个部下有一个任务,交代任务的时间为B[i]执行任务的时间为j[i],不能同时对两个部下交代任务,但是两个任务可以同时执行,选择交代顺序使得所有的任务尽快完成

按照直觉来说,执行时间越长的越应该放在前面,当然只靠直接还是不准的,下面举个简单的栗子来证明一下

  • 交代事件相同的情况下
    如下可以看出执行时间长的在前面是比较优秀的回答
    在这里插入图片描述
  • 交代事件不相同的情况下
    如下可以看出执行时间长的在前面是比较优秀的回答
    在这里插入图片描述
后续
题目五:酒交易,一条直线上有n(2<=n<=100000)个等距村庄,要么买酒要么卖酒,第i个村庄需求为ai,ai<0需要买酒,ai>0需要出售酒,所有ai相加等于0,k个单位的酒从一个村庄到相邻的村庄要求是k的劳动力,最少要求多少劳动力
  1. 从最左便开始考虑,如果a1大于0,说明肯定有酒从2号村庄到一号村庄去,劳动力就是k,那么我们现在假设有四个村庄,不难看出其实最后的劳动力就等于每个相邻的村庄相加最后得出的结果
    在这里插入图片描述
后续
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值