提高组贪心专题做题记录
提高组贪心专题做题记录
A [NOIP2012 提高组] 国王游戏
考虑采用邻项交换法求解。考虑两个相邻的大臣
化简得:
按照该不等式作为排序依据排序即可。最后高精度求出答案即可。
^B 皇后游戏
首先按照正常方法去推式子。依然考虑邻项交换法。首先需要知道
考虑
那么
我们实际上可以先不考虑
以此作为排序依据贪心。不过会发现交上去只有
考虑邻项交换法所需要的比较函数
- 非自反性:
。 - 非对称性:
。 - 传递性:
。 - 不可比性的传递性:
。
实际上上述比较方式是不满足不可比性的传递性的。那么考虑修正,实际上问题只出现在
C [JXOI2017] 加法
考虑二分答案,然后考虑怎样 check
。我们可以求出当前每一个数至少要被增加的次数,也就是至少要被多少个区间选中。然后从左边开始贪心,每一次选出还没有被选的、包含了当前节点的、右端点最远的区间,显然这样一定最优。
考虑如何维护,包含当前节点的限制可以扫描线解决,然后动态维护右端点的排序可以用优先队列。最后我们还需要动态维护
D 加工生产调度
与 B 题一模一样。采用邻项交换法甚至可以使前半部分证明更简洁。
E [NOIP2018 提高组] 赛道修建
仍然考虑二分答案。现在考虑怎样判定长度是否合法。我们在树上进行 DFS,每一个点给它的父亲传上去一条链,然后再父亲处将这些链进行合并,使得长度大于等于
现在的问题就是合并链,我们既要保证合并的链数最多,又要保证剩下的链最大值尽可能大,所以考虑从小到大贪心,每一次二分找出与之匹配的链即可。这样剩下的链一定是最大的。
F [JOI 2022 Final] 让我们赢得选举
首先贪心去想可以得到这样一个策略:每一次演讲一定是所有人同时在一个地方演讲,并且在全部
考虑先枚举这个
这个时候就可以考虑 dp 了,设
看似复杂度
*G [省选联考 2020 B 卷] 丁香之路
发现题目的要求很像欧拉路,我们将
此时欧拉图的性质已经满足,但是还没有满足联通性。考虑并查集缩点,然后跑一个最小生成树,每一条边只连相邻的点。跑出最小生成树大小后乘二(因为每一条边要走两次),再加上前面求出的总和即为答案。
*H [NOIP2023] 双序列拓展
首先需要想到一个最简单的
考虑这个 dp 的实质。假如构造出一张网格图,令
然后我们考虑题目中给出的特殊性质。假如
那么对于总体来讲,我们依然可以找出
^I [NOIP2012 提高组] 疫情控制
md 这个题让我认识到了贪心的险恶——你永远不知道什么数据可以 hack 掉你。
思路比较简单,我们先二分答案。然后接下来让每个点尽可能向上跳,最多跳到根节点的儿子处。现在有一些子树没有满足要求,刚才我们要求每个点最多跳到根节点的儿子处,因此有一些点会剩下一些剩余的时间没有用,我们再用这点时间取填上那些尚未满足要求的子树即可。
难点就在于怎么填这些子树。首先我们找到还可以挪动的自由点,需要保证它走到根节点后还有剩余时间,把这样的点存到 set
里;否则的话这个点就在这里驻扎了,打一个标记。接下来 DFS 一边整棵树,将标记上传(也就是看当前节点的子树内的所有叶子是否都满足要求了)。
再回看刚才 set
中的点,如果该点对应的子树尚未满足要求,且走到根节点后的剩余时间不足够走回来,那么这个点一定就在这里驻扎set
中的点就是一定可以自由挪动的点。此时子树尚未满足要求的就是待匹配的节点,我们将自由挪动的点按剩余时间递增排序,每一个点找到它能匹配的所需时间最大的节点匹配。根据贪心策略,这样做一定最优。
然后看待匹配点能否全部匹配上即可。复杂度
^J [CF1935E] Distance Learning Courses in MAC
首先我们需要发现一些性质:
- 对于一个
,我们可以将它们在二进制下相同的前缀删去,并直接将其加入答案。 - 对于一个
,如果它们在第 位上不同,那么答案中要么第 位上是 ,要么 位上全是 。
然后我们就可以开始贪心了。首先根据第一条性质算出当前已经知道的答案,接下来对剩下的部分从高位往低位贪心,如果这一位上有至少一个可以自由选择的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理