贪心问题集

来源:互联网 发布:淘宝围巾店推荐知乎 编辑:程序博客网 时间:2024/05/21 16:47

转自noip复习资料——葫芦岛一中李思洋

这个贪心嘛,只要贪就好了。长者曾经说过,贪心的时候可以每种贪心策略都来一遍然后取min,这个够直白了吧,贪心很需要脑洞。

一.装载问题:

1.简单装载问题

n件物品,容量为c的背包,将哪些物品放入背包使物品数量最多?
这个题只要sort一遍,把小的塞进去就可以,因为不需要考虑价值。
小的优先装

2.部分背包问题

有n件物品和一个容量为c的背包。第i件物品的重量为w[i],价值为v[i].每个物品可以取走一部分,价值和重量按比例计算。求解将哪些物品装入背包可使价值总和最大。
因为可以拿一部分,所以只需要按价值/重量sort一遍,装大的就可以。
性价比高的优先装

3.乘船问题

n个人,第i个人的重量是wi每艘船的最大载重量都为c最多可以乘2个人,用最少的船装尽可能多的人。
让轻的人和重的人一条船,最轻的和最重的…………最后可以一个人一条船。
组合起来最小的优先装(最小的找最大的配对)

二.区间问题

1.选择不相交问题
数轴上n个开区间(ai,bi),选择尽量多的区间,使这些区间两两没有公共点。
按bi从小到大排序把所有与第一个区间相交的区间排除在外排序后再扫描一遍就可以了
2.区间选点问题
数轴上有n个闭区间[ai,bi]取尽量少的点,使得每个区间内都至少有一个点(不同区间内含有的点可以是同一个)。
把所有区间按bi从小到大排序(bi相同时,a从大到小排序),然后取第一个区间的最后一个点。
3.区间覆盖问题
数轴上有n个闭区间[ai,bi].选择尽量少的区间来覆盖指定线段[s,t]
(1)预处理:扔掉不能覆[s,t]的区间。
(2)把各区间按a从小到大排序。如果区间1的起点不是s,无解,否则选择起点在s的最长区间。
(3)选择此区间[ai,bi]后问题转化了覆盖[bi,t],于是返回(1)直到[s,t]被完全覆盖为止。

三.删数问题

给出一个N 位的十进制高精度数,要求从中删掉S个数字(其余数字相对位置不得改变),使剩余数字组成的数最小。
1. 每次找出最靠前的这样的一对数字——两个数字紧邻,且前面的数字大于后面的数字。
删除这对数字中靠前的一个。
2. 重复步骤1,直至删去了S个数字或找不到这样的一对数。
3. 若还未删够S 个数字,则舍弃末尾的部分数字,取前N-S个。

四.工序问题

n件物品,每件需依次在A、B机床上加工。已知第i件在A、B所需加工时间分别为Ai、Bi,设计一加工顺序,使所需加工总时间最短。
1. 设置集合F、M、S:先加工F中的,再加工M中的,最后加工S中的。
2. 对第i件,若Ai>Bi,则归入S;若Ai=Bi,则归入M。否则归入F(“拉开时间差”)。
3. 对F中的元素按Ai从小到大排列,S中的按Bi从大到小排列。

五.种树问题

一条街道分为n个区域(按1~n编号),每个都可种一棵树。有m户居民,每户会要求在区域i~j区间内种至少一棵树。现求一个能满足所有要求且种树最少的方案。
1. 对于要求,以区间右端(升序)为首要关键字,左端(升序)为次要关键字排序。
2. 按排好的序依次考察这些要求,若未满足,则在其最右端的区域种树,这时可能会满足多个要求。