《信奥一本通》提高版—简要题解
贪心
- 活动安排:
- 按右端点排序,因为越早结束越好。
- 然后从1扫到n,每次比较当前位置线段的左端点是否大于上一个选的线段的右端点。如果大于,那么ans++,将上一个选的线段的右端点更新为当前线段的右端点;如果小于,那什么都不用做。因为选上一条一定比选当前这一条更优(结束时间更早)。
- 种树
- 按右端点排序,对于每个区间的需求,从右端往左端扫,只要没种到树的就种,ans++。
- 因为要使前面的需求尽量与后面的需求重叠,从而使树的数量最少
- 喷水装置
- 观察+画图发现对于一个圆,它实际上覆盖的有效区域是它与上边框交的两点之间的区间。那么对于一个圆就可以转换成一个区间。从而问题转换成为了“区间覆盖”。
- 注意,有些圆太小与上边框没有交点,这样的圆可以直接舍去
- 加工生产调度
- 设有两个工件x,y,时间为a1,b1和a2,b2。使用邻项交换法即可。
- 智力大冲浪
- 用可撤销贪心。先将挑战按结束时间递增排序。然后只要有时间,就不断按顺序将挑战塞入优先队列。如果发现不能塞不进了,就看看是否能替换掉队列中危害最小的挑战。于是最后,m-被替换出来的挑战危害之和就是答案
- 数列极差
- 找规律发现不断用最小的与乘次小的合成,得到的是max值。用最大的与次大的合成,得到的是min值。那么同“合并果子“的做法即可
- 数列分段
- 对于每段新开的“内存”,在容量不大于m的情况下,能塞尽量塞。塞不进了再开一个新内存,ans++
- 线段
- 同(“活动安排”)按右端点排序,对于当前位置,拿其左端点比较上一个选的线段的右端点。如果左端点>右端点,那么ans++,上一个选的线段的右端点更新为当前线段右端点;如果小于,就什么都不用管。因为选上一条一定比选当前这一条更优(右端点更前)。
- 家庭作业
- 可撤销贪心。同“智力大冲浪“
- 钓鱼
- 从样例解释中可以隐隐约约察觉出:赶路时间与钓鱼时间是独立的,两者没有互相影响。那么就可以枚举结束点(从1枚举到n),直接可以算出赶路所需时间,那么拿(总时间-赶路时间)/5可以得到钓鱼次数m。那么问题就转换成了“从n个序列选m个最优元素“了。
- 糖果传递
- 没有环的话,就是“均分纸牌”。那么对于此题可以断环成链,取最优值。复杂度会爆炸。
- 用数学办法,假设断环的位置为k。那么就变成了a(k), a(k+1), … , a(n), a(1), a(2), … , a(k-1)。
- 位置k的贡献为a(k)
- 位置k+1的贡献为a(k)+a(k+1)
- …
- 位置n的贡献为a(k)+a(k+1)+…+a(n)
- 发现每个位置的贡献都=前一个位置+a(当前位置)。那么为了方便表达,用c(x)表示a()的前缀和。
- 那么重新表达后如下:
- 位置k的贡献为c(k)-c(k-1)
- 位置k+1的贡献为c(k+1)-c(k-1)
- 位置n的贡献为c(n)-c(k-1)
- 位置1的贡献为c(n)-c(k-1)+c(1)-c(0)=c(1)-c(k-1) C(n)一定为0
- 那么其实位置x的贡献为|C(x)-C(k-1)|
- 那问题不就转换成为了将C()看成一个个点,求某个点x,使得其余点到x的距离之和最短。显然x为中位数
二分/三分
- 愤怒的牛:
- 同“跳石头”,二分最短跳跃距离,看看最后所需隔间数是否>=m
- Best Cow Fences:
- 二分平均数,将序列每个元素减掉平均数,那么问题就转换成了是否存在一个长度>=L的区间的区间和>=0。这个问题用一个数组mn[x]记录前x个前缀和中的最小值,然后从L枚举到N,看看sum[x]-mn[x-L]是否>0就好了
- 曲线:
- 首先需要证明:函数g(x)=max{n个开口向上的二次函数},其依然具有下凸性。
- 使用数学归纳法,假设只有两个二次函数,那么其合成后一定是一个下凸性函数。那么假设有三个二次函数,将两个合成为一个下凸性函数后再与第三个二次函数合成后仍然后下凸性函数。那么n个二次函数同理可证,仍为下凸性函数。
- 那么在峰值函数中找最值显然三分即可
原文地址:https://www.cnblogs.com/BigYellowDog/p/12251828.html
时间: 2024-09-30 15:10:37