贪心和分治资料

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由于要与之前的最小值作比较,程序中可以使用优 先队列,或用小根堆维护当前确定下来的前k天写 的作业。数据量不算大时,也可以用插入排序方式 维护这个单调队列
这种方法使用了贪心的思想,但算法执行过程中 需要维护一个单调队列,稍微麻烦些。
方法二:按作业所扣分数递减排序。于是乎:
然后假设有一个维护着天数的格子,将(4,7)放 到第4天那格子中,(2,6)放在第2天那格子中, 又遇到(4,5),由于第4天格子已被占用,则将 (4,5)放到第4天之前空闲的格子中,此处放在1 或3都可以,然后(3,4)也会把前边4个格子占上。 来了(1,3)发现前边没他地方了,那就不写这门。 因为按照贪心思想按扣分由大到小排序后,前 边上占位的肯定比它扣分多,所以只能不写这 个分数少的了。
分治思想
问题的分解 问题 S
问题S1
问题S2 ……
问题Si ……
问题Sn
子问题求解
S1的解
子集解的 合并
S2的解 ……
Si的解 ……
Sn的解
S的解
例题1:给你一个装有n枚硬币的袋子。n 枚 硬币中有一个是伪造的,并且那个伪造的硬 币比真的硬币要轻一些。你的任务是找出这 枚伪造的硬币。
为了帮助你完成这一任务,将提供一台可用 来比较硬币重量的仪器,比如天平。利用这 台仪器,可以知道两组硬币的重量是否相同。
Simple Input: 10//有10个人接水 56 12 1 99 1000 234 33 55 99 812 //每个人接水 花费时间 Simple Output: 291.90 //平均每个人接水花费时间,精确到小数 点后2位
分析:
想一想,如果接水时间长的放在前面,那么后 面的人等待时间就会增长,所以总的接水时间就 会变得更长。 所以就应该按接水时间从短到长排序,然后累 计每个人花费的时间,再来自百度文库以总人数就是平均花 费时间了。
分治:
分治(divide-and-conquer)就是“分而治之” 的意思,其实质就是将原问题分成n个规模较 小而结构与原问题相似的子问题;然后递归 地解这些子问题,最后合并其结果就得到原 问题的解。当n=2时的分治法又称二分法。
其三个步骤如下; 1. 分解(Divide):将原问题分成一系列子问题。 2. 解决(Conquer):递归地解各子问题。若子 问题足够小,则可直接求解。 3. 合并(combine);将子问题的结果合并成原 问题的解。
例题2: Doing homework again
Problem Description
小朋友现在需要完成N门科目的作业。现假设他完成一门作业所 需时间为1天。给出N门作业的上交截止时间(天),以及不及 时交作业期末成绩所被扣的分数。假如小朋友现在没办法将这些 作业全部都完成,那他该如何安排使得他所扣的总分数最少呢? 例: 假如N=7,即现在有7门作业要完成,各科的属性见下表:
算法的效率:用O(nlogn)的时间排序。然后 用O(n)的时间来安排n个活动 一般贪心的题目都要进行对某一属性的排序工作
例题1:n个人排队接水,编号为1到n,每个人的 接水时间为Ti,请编程找出这n个人的排队序列 (接水时间一样的按照他们的编号排队),使得 他们的平均等待接水时间最小。 1 <= n <= 100000。 0 <= Ti <= 200000。
分析:
方法1:如果用枚举的话是可以算出答案的, 即先把第一枚银币放在天平的左侧,然后放第 二枚银币在天平的右侧,如果一样就把第二枚 银币取下,把第三枚银币放在天平的右侧…直 到左右天平的银币重量不同,则放在右侧的银 币是假的。 如果第一枚银币和第二枚重量不同,则重量 较轻的是假银币。
但是这样的时间复杂度是O(n),所以理论上应 该有一种更快的方法.. 就是..
方法2: 如果银币总数是偶数个,把银币分成个数相等的 两堆,分别放在天平的左右两侧,然后把重量较 轻的又分成两堆,再放在天平的两侧.. 如果银币总数是奇数个,则取出任意一个,剩下 的分成两堆放在天平两侧,如果这时候天平两侧 的重量相等,则取出来的那一个银币正好就是假 币,否则继续刚刚的步骤,分成数量相等的两堆 放在天平上..
事件序列问题
已知N个事件的发生时刻和结束时刻(见下表,表 中事件已按结束时刻升序排序)。一些在时间上没 有重叠的事件,可以构成一个事件序列,如事件{2, 8,10}。事件序列包含的事件数目,称为该事件序 列的长度。请编程找出一个最长的事件序列。
策略:尽可能选择结束时间早的->先排序
事件序列问题
分析:由于输入的活动以其完成时间的非减序 排列,所以算法每次总是选择具有最早完成时间 的相容活动加入集合A中。直观上,按这种方法选 择相容活动为未安排活动留下尽可能多的时间。 也就是说,该算法的贪心选择的意义是使剩余的 可安排时间段极大化,以便安排尽可能多的相容 活动。
答案:5,即不写第一个和第二个作业
分析:在希望被扣的分数尽可能少的情况下,自 然要先完成那些扣分多的作业,同时还要兼顾考 虑作业的截止日期,然后作出决策。 方法一:对截止日期进行递増排序,若截止日期 相同,则按作业不完成所扣分数递减排序。于是 对上边的用例有:
前4个肯定可以在给定的期限内按时完成。从第5 个开始,需要做一些工作:将第5个所扣分数与前 边的4个最小值比较,若比最小值大,则将这第5 项替换前边最小值项。此处即将(4,5)替换掉(1,3)
这样这位小朋友就应该写(4,5)这项作业而不写(1,3) 才能保证在当前所扣的分数最少。 接下来取(4,2)与 前4个中的扣分最小值比较,发现都比它大,那就 不替换,直接不写这个作业。至此已经定下来写4 科,而不写2科即(1,3)和(4,2)。最后(6,1)可以直接 在第五天来写。最后扣分最少为5分。
ACM中期培训
贪心和分治
讲解人:李川皓 制作人:曾卓敏 哈尔滨理工大学ACM集训队
贪心:
贪心,顾名思义贪心算法总是作出在当前看 来最好的选择。也就是说贪心算法并不从整体最 优考虑,它所作出的选择只是在某种意义上的局 部最优选择。当然,贪心算法得到的最终结果也 是整体最优的。 贪心只是一种思想,我们举几个例子来说明 一下~
相关文档
最新文档