CF2023D 做题记录

CF2023D 做题记录

题目链接来源

考虑 01 背包。让 \(w_i\) 为体积,\(p_i\) 为权值,现在要让权值的乘积最大。答案即为所有 \(w \times f_w\) 的最大值。

但这么做复杂度是 \(O(n \times \sum w_i)\) 的过不了。

我们现在想缩小 \(n\)\(\sum w_i\) 的枚举范围,考虑将 \((p_i,w_i)\) 按照 \(p_i\) 分组。

当两个 \(p_i\) 相同时,贪心地想取 \(w_i\) 较大的更好。

因此对于相同的 \(p_i\),按照 \(w_i\) 从大到小排序。

\(p_i=p\) 最先取,取了前 \(x\) 个,其中的 \(w_i\) 和为 \(s\),最小值为 \(y\),且这么取是最优的。

最优代表删除任何一个数都不会更优,而显然你删除最小值是最优的。于是有:

\[(\dfrac{p}{100})^xs \ge (\dfrac{p}{100})^{x-1}(s-y) \]

我们其实想要的是一个 \(x\) 的上界。考虑 \(s-y \ge \dfrac{x-1}{x} s\)。原理是最小值一定不大于平均数。

\[(\dfrac{p}{100})^xs \ge (\dfrac{p}{100})^{x-1}\dfrac{x-1}{x} s \\ (\dfrac{p}{100}) \ge \dfrac{x-1}{x} \\ x \le \lfloor\dfrac{100}{100-p}\rfloor \]

\(p=100\) 时候这个式子会假掉。但这时它对于 \(p\) 的积不会产生影响,无脑全取即可,特判掉。

写个程序计算可知全部可能被取的数的个数 \(m=\sum\limits_{p=1}^{99} \lfloor\dfrac{100}{100-p}\rfloor = 481\)

但是这么做还是会超时。考虑缩小 \(\sum w_i\) 的值。

设选出的一组最优解中,\(s=\sum w_i\)\(P=\prod \dfrac{p_i}{100}\)。且其中一个数为 \((p,w)\)

从中删除一个一定不优,于是:

\[sP \ge \dfrac{100P}{p}(s-w) \\ s \ge \dfrac{100}{p}(s-w) \\ \dfrac{p}{100}s \ge (s-w) \\ s \le \dfrac{w}{1-\dfrac{p}{100}}\\ \]

题目中有条件 \(wp \le 2\times 10^5\)

\[s \le \dfrac{\dfrac{2\times 10^5}{p}}{1-\dfrac{p}{100}}=\dfrac{2\times 10^7}{p(100-p)} \]

和一定差大积小,令 \(p=1\),则上述式子取到最大,大约是 \(2 \times 10^5\) 左右。

posted @ 2025-03-21 19:34  邻补角-SSA  阅读(19)  评论(0)    收藏  举报