题解 P10055【[CCO2022] Rainy Markets】

首先尽量把所有人放在左边的车站,然后再尽量放在右边的车站,求出此时 i 位置车站有多少空位留给 i+0.5 位置的人,记为 fi。也就是:

fimax{bimax{pi1fi1,0},0}

然后从右向左贪心。对于第 i+0.5 位置的人,设去左边、不动买伞、去右边的人数分别为 li,mi,ri。由于右侧都已经尽量优地分配过,令这个位置的人优先去右边不会使得情况变得更劣,因此先贪心把右边填满,也就是:

rimin{bi+1li+1,pi}piri

之后为了使总花费尽量小,肯定是在不影响左侧的情况下尽量都去左边,这时候计算过的 fi 就派上了用场,fi 就代表着左边有多少地方一定可以给 i+0.5 位置的人,且不会影响左侧的决策,也就是:

limin{fi,pi}pili

剩下的人一定需要买伞,因为即使在这里不买伞,去到左边也会使得左边的一些人需要买伞。我们让他们直接就地买伞:

mimin{ui,pi}pimians+mi

如果还有剩下的人,就不得不让他们去左边挤一挤了:

li+pi

如果 li>bi 即为无解,所有 libi 即求得了最优解及其构造。

时间复杂度 O(n)

所有关键都在上文给出了,代码就不放了。

posted @   rui_er  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2022-01-08 题解 CF482B【Interesting Array】
点击右上角即可分享
微信分享提示