NOI 嘉年华
看这篇题解
对这篇题解做一些解释
首先看到这道题目,时间范围很大,所以我们先考虑如何对区间进行排序,但是你会发现无论是按照左端点排序还是按照右端点排序,都很难DP下去,所以我们只能对时间排序,然而时间非常大,要对时间进行排序,就必须要离散化(这里启发我们,不要太固定思维觉得大的时间无法排序),设离散化之后的时间范围为
按照时间排序之后,有一个好处,因为题目要求不能相交,所以分在一个嘉年华的活动的起始和终止时间一定是一段一段的(这个起始和终止时间不一定要与某个区间的左右端点重合,比如就考虑把
然后来看第一问,还有一个固定思维就是觉得DP的某一维应该设置差值,但还是发现推不出来,所以也不要固执了,直接像题解这么设
然后题解对第一问DP方程的推导,比如第一种情况
这个方程的意思是
那么为什么最后统计答案的时候像题解那样子统计就没问题了呢?或者说,为什么最开始设DP数组的状态表示第二组的最大值就行了,而不是其他什么的?
这是因为像题解这样子统计要一定不会遗漏最优答案,我们假设已经得到最优答案,也就是说不可能再找出一种方案,使得这个方案中活动数较少的一组的活动数比这个最优答案中活动数较少的一组的活动数多,那么对于这个最优答案,如果是第二组的活动数更多,根据对称性,我们可以直接对称一下,变成第一组的活动数更多,此时第二组的活动数一定是在第一组选择了其选择的活动之后,从剩下的没有被第一组选择的活动中选择最多的出来得到的,如若不然,那么第二组的活动数就可以增加,此时要么第一组的活动数少于第二组的活动数,要么第二组的活动数仍然少于第一组的活动数,无论哪种情况,都与最优答案的假设矛盾,所以我们不会遗漏最优解
然后是题解对第二问的处理,这个跟北大ACM队的远足这道题目的trick是一样的
然后是题解在推导
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理