The Parade
本文思路来自伟大的@FxorG
二分的单调性:如果
主要问题是贪心的选法。
原问题所引出的可能得选人的方案可能是离散的,比如:
2
2 5
当每排人数是2时,一下方案是一种最优解:
1个身高为1的,1个身高为2的
1个身高为1的,1个身高为2的
2个身高为2的
如果把人看成一条柱:
总共3组,我们发现,他们的下标(身高)范围是
也就是说,我们选取的方案之间可能会有交集(就像上面的红色和橙色,虽然相同身高的人与人之间没有区别,但是不管你怎么交换,它们还是“交叉的”)。
先考虑没有交集的情况怎么贪心,也就是说不同身高的人只会被搭配一次。
那么方案大概长这样:
把人看成线段上的点,那么选法就是一条条线段,每个人只能被分进一排,等价于点只能被覆盖一次,也就是P1803 凌乱的yyy / 线段覆盖。
为了方便理解,先把人标上编号,看成有区别的。
这个时候有点问题,就是人可能不是连续的:
但是因为人实际上没有区别,你可以把它们移动到贴在一起,变成连续的。上述“交叉”的方案就是阻碍了我们将方案变成连续的一段段线段。
现在考虑如何去调整有“交叉”的选法,让它变成连续的线段。
其实就是说身高差了1的两种人最多只会配对一次。
假设在
假设第一排中
我们想要让它们分成自己内部的一条线段和一条跨身高的线段。
于是必然可以把它们中的一部分分到自己内部和跨身高的部分。
然后就是线段覆盖问题了,因为区间长度一样,左端点排序等价于右端点排序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构