CF2023 - D. Many Games
先让 \(p\) 除以 \(100\),相当于给你两个数组 \(p, w\),然后要选择下标集合 \(S\),使得:
\(p\) 的积乘上 \(w\) 的和最大化。
注意到 \(p_i\) 是整数,并且 \(1\le p_i \le 100\)。
那么容易想按照 \(p_i\) 分类。
然后 \(w_i\) 对于固定 \(p\) 一定是选择排序后的最大值后缀。
目前 \((P,Q)\),考虑选择 \(i\):
一定是后面的式子大于前面的式子才会选择,考虑做比例,那么不等式就是:
把 \(p\) 再乘回去:
题意有:\(p_i\cdot w_i \le 2\cdot 10^5\)。
所以 \(W\) 最后不会很大,只会在 \(2\cdot 10^5\) 以内。
然后我们考虑按 \(p_i\) 分类。
假设选择了某个 \(p_i\) \(c\) 个,然后考虑选入的最小的值是 \(w_i\),考虑它不能删除时:
令:\(q_i=p_i/100\):
然后只需要考虑 \(\Delta=0\) 的情况,限制更加严格:
也就是说对于一种概率 \(p_i\) 的物品,最多选择 \(\frac{100}{100-p_i}\) 个
然后对于概率等于 \(100\) 的物品无脑全部选入即可。
这里直接用 \(dp_{i,j}\) 表示考虑完前 \(i\) 种物品,目前 \(W=j\) 时的最大的 \(P\)。
最终复杂度就是 \(O(2\cdot 10^5\times 482)\)。
本文作者:weirdoX
本文链接:https://www.cnblogs.com/weirdoX/p/18491764
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步