每周学习总结

2021.3.26

贪心算法专题2

(点进来的同学!,不要划走,看完这句话,这篇文章虽然2000多字,但大多都是线性文字大白话,所以各位阅读不存在问题,且阅读速度极快,想要掌握贪心的各位可以参考一下,思路和总结,至于理解只是正对题目而言的。)
(注意错误思路是我做题时开始的思路,提交若干次不ac之后,通过各种渠道之后可以获取正确思路,若是有同学开始时和在下思路一致,那么则需要改正)

课下刷题理解

1,题干,给定若干个区间,每个取若干个数,使得每个区间中至少有两个数在取定的数中。求取出数的最小值。

理解,这题与之前雷达区间问题相似,但之前是每个区间拿一个数,所以可以从这种方法进行类比。

思路一,(不具有普遍性,只能解决是2个元素的情况)按照首元素从小到大进行排序,然后按照雷达问题取一遍。
之后就是按照雷达问题,将尾元素从小到大进行排序,解决即可。**注意这样有可能两次的取值会重复所以第一次取值的时候要标记一下,第二次取值如果取到该值就减一。

思路二,从第一个区间中取出m个数(m是要求取得最小值),取值的时候是从大到小一次取,然后将取到的值放进一个数组中,开始到第二个区间,将第二个区间的首元素与上一个区间的尾元素进行比较,如果小于等于尾元素,就进入一个循环,将之间数组中的元素进行判断,看有几个元素在第二个区间内,如果有t个元素,那么需要构建一个循环,共m-t次,从第二个区间的最后开始取。

总结,该题如果是两个那么可以用之前的方法正反两边即可,但如果取大于两个元素就只能用思路二,所以得出普遍规律。

2,题干,有若干个货物,每个货物都是高度为1,但货物的大小不同,分别是11,22,33,44,55,66,但是每次最多将6*6,个货物送出去,问将所有货物送完所需要的最小次数。

理解,每次最大可以送66,要想运送最小次数,那么只要每次都尽量是66即可。

错误思路,因为每想要次都是66那能合成到66的有33,22,1*1所以先对着3种货物进行取余在从大到小。

正确思路,按照次序66可自己单独一次,55剩下的11个格子可以填充11,44,可以先填充22的五个再去填充11的格子,到了33情况就分好几种,不要怕麻烦,先对4取余,在按照123单独分析,每次都是先放22后放11,最后22,1*1同理。

总结,这题要想达到最优是每次尽量放至66不假,但如果一上来就对这三种货物取余,就会走偏,因为,如果55的数量恰好的话,根本不会使得22的能够组成66。所以应该从大到小排序。

3,有一条直线,直线的两端是连续的房,直线的上方是1,3,5至399,直线的下方是上方数字加一。因为要装修所以要对房间内的桌子进行搬动从a房间搬动到b房间,每次搬动需要10分钟,如果从a搬到b房间,那么该十分钟内,不允许有别的搬运计划通过a到b之间的走廊,但是如果不经过ab之间的走廊,这可以同时搬动。问搬动的最小时间。

理解,将两个点转换为带有起始和终止坐标的区间,然后然后找出每10分钟可以通过的最大的数目,然后就可以求出最小的时间。

错位思路,现对a,b进行分类,将奇偶分开,然后排序,从小到大,每个奇数对应一个偶数,这样每次走的路程最短,就是最优。***显然是不成立的,因为题目中说只能从一个房间办到另一个房间,不能给他改变路线。

正确思路,至于ab可以同为奇数或者同为偶数,或者一个是技术一个是偶数,我们将问题简化,将所有的偶数都减去一,然后把每个区间进行标记,是指将区间经过的房间号码进行排序,每出现一次号码就++。然后求出数值最大的号码。

总结,这题想要达到贪心是每次走的计划数最多不假,但这样就需要考虑搬运的顺序,就将问题复杂化,咱们不妨可以将搬桌子最小的时间转化为走某一段走廊的最多次数,这一段最多就是搬动次数最少,因为要想办完所有的桌子,这一段路程最少要走这么多次。

课上内容理解

1,题干,a,b两个数组,要求取出n/2+1个下标,使得所选的下标对应的元素之和的两倍大于所有的元素之和。

理解,所选元素的两倍大于全部元素之和可以理解为所选元素的两倍减去全部元素,就是所选元素大于剩余元素。
如果将a和b单独排序,因为是取a,b的相同下标,所以只能保证一个数组满足条件。

思路,先对a数组进行排序,但是返回的是a的下标,也就是构建一个数组,使得该辅助数组中的元素顺序是按照a中元素大小从大到小的下标。先取出a中的第一个元素,然后按照辅助数组中元素顺序1开始每次取相邻两个元素中一个,取这两个相邻元素中b值较大的下标,如果n是偶数,就多取最后一个元素。

总结,这题无法直接用排序直接解决,因为无法保证b中元素也是交的的。但我们将a排序之后,在a数组中每次取得是比下一次大,而b数组每次也是取两者中较大一个,合起来b数组中也是最大的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值