一些经典贪心模型

由于是个人总结,可能有一些不全面的地方,还请大佬们不吝赐教

(现在才来总结这些东西,我太菜了)

一、区间贪心

1、选尽量多的不相交区间:按右端点排序,然后选择第一个,删掉与它相交的区间,继续做

2、选最少的点是每个区间都包含k个点:按右端点排序,然后从后往前来选择点

3、选最少的区间使整个大区间被覆盖:按左端点排序,然后选择右端点最远的区间

4、可能还有一些弦图上的东西,算了。。。。

二、排序贪心

这个其实比较简单

先假定所有东西都按最优顺序排好了

然后交换两个东西,就可以得到一个不等式

再按这个不等式排序做就好了

(其实有点像斜率优化的推导,只不过斜率优化用的是两个决策点来比较)

三、配对贪心

有很多这种题,一般只能现场想。。。

但是它有一个原则,就是在满足自身条件的情况下,尽量让其他人配对的代价更小(约等于恰好满足自己的条件)

如:【NOIP2012】疫情控制的第二步贪心,时间机器,NOIP2018 Day1T3 赛道修建。。。。。。

四、异或贪心

1、选一段区间使它们的异或和最大:

本质就是选两个前缀异或和让它们异或起来最大

建一棵01Trie树,然后边查找,边插入,查找就是让当前点和Trie树上的坐标尽量不同(相反方向走)

如果多次查找给定区间中的子区间的最大异或和?不会做了

(感觉可以可持久化Trie树,但是仔细想想就发现有问题)

(感觉可以离线?但是还是有问题吧。。。。)

(我太菜了想不出来)

如果有大佬想到了请在评论区留言。。。

如果还带修改?吐血2333

2、选一个子集让它们的异或和最大:

线性基裸题

如果多次查找给定区间中的子集的最大异或和?套个线段树吧。。。可能复杂了。。。暂时这样做吧反正线性基合并只有logn

大佬博客:区间查询异或最大值——cf1100F,hdu6579 - zsben - 博客园

3、异或最小生成树:

建01Trie树,然后从下往上合并左右子树,要求最小的话,就从左右子树开始尽量往相同的方向走,好像是O(nlogn)。。。

反正看到异或就想Trie树,线性基。。。

五、树上贪心

1、Repulsed:树上最小覆盖贪心(luogu消防局的设立)

2、疫情控制的第一步贪心

3、左偏树贪心:看情况吧。。。。不要乱用。。。。

六、其他贪心

(其实是想不出这种贪心叫什么名字了)

1、排队接水问题:(注意排队的顺序不能改变,且一个人必须连续接完水)

把所有的水龙头中选一个预订时间最小的水龙头,加入当前的人的所需时间,可以线段树优化或用优先队列

如果可以改变排序的顺序,则直接从大到小排序,然后做法同上,可以得到最短时间。

2、电池使用问题:可以扩展为n个电池m个接口,使机器的运转时间最长。

每次二分一个答案mid,则小于mid的电池是可以通过某种方法来填满mid*m的总用电量的

而大于mid电池是永远无法完全利用的,所以它可以用部分只有mid,把这些电量加起来与mid*m比大小即可

当然也有单调队列的做法:F - Distinct Numbers

3、最短时间烙饼问题:假设有n个饼,每个饼总共需要烙ai分钟(可以不连续),锅的最大容量是m,每个时刻可以随意选择烙饼的集合。求最短烙完所有饼的时间。

答案是:max(sum(ai)/m,max(ai))

七、网络流、费用流、模拟费用流

虽然有一些常见的模型,但是大部分建模分析还是得重新推,考场上慢慢想吧。。。(CSP应该不会考吧。。。)

你可能感兴趣的:(贪心,总结,贪心,总结)