洛谷 5308 [COCI2019] Quiz 题解

博客观赏效果更佳

题意简述

n n n 个人, k k k 轮比赛。每次如果淘汰了 x x x 个人,还剩下 m m m 个人,得分增加 x m \dfrac{x}{m} mx 的奖金。。假设你能控制每次淘汰多少人,最大化得分。

思路

d p [ i ] dp[i] dp[i] 表示现在还剩下 i i i 个人的最优方案 (先不考虑轮数)。

那么 d p [ i ] = m a x ( d p [ j ] + i − j i ) dp[i]=max(dp[j]+\dfrac{i-j}{i}) dp[i]=max(dp[j]+iij),其中 0 ≤ j < i 0\le j0j<i

显然能斜率优化。

觉得不显然的小伙伴们看一下:
{% fold %}
斜率优化式子:
j ≥ k j\ge k jk j j j 优于 k k k,那么
d p [ j ] + i − j i > d p [ k ] + i − k i dp[j]+\dfrac{i-j}{i}>dp[k]+\dfrac{i-k}{i} dp[j]+iij>dp[k]+iik
d p [ j ] − j i > d p [ k ] − k i dp[j]-\dfrac{j}{i}>dp[k]-\dfrac{k}{i} dp[j]ij>dp[k]ik
d p [ j ] − d p [ k ] > j − k i dp[j]-dp[k]>\dfrac{j-k}{i} dp[j]dp[k]>ijk
由于 j ≥ k j\ge k jk,所以 j − k > 0 j-k>0 jk>0,直接除
d p [ j ] − d p [ k ] j − k > 1 i \dfrac{dp[j]-dp[k]}{j-k}>\dfrac{1}{i} jkdp[j]dp[k]>i1

也就是 s l o p e ( k , j ) > 1 i slope(k,j)>\dfrac{1}{i} slope(k,j)>i1 时, k k k 就没用了。

而如果每一个时刻 k k k 没用了,后面 i i i 更大, 1 i \dfrac{1}{i} i1 更小, k k k 更不可能有用。这个是弹队首的条件。

其次可以看出来,这个队列是斜率单调递减的。这个就是加入队尾的条件。
{% endfold %}

然后我们就发现一个问题: k k k 的限制怎么办?

w q s wqs wqs 二分: 对于每个转移过来的 j j j,我们给他加上一个附加权值 x x x。显然, x x x 加的越多,选的段数越少。转移的时候记录一下段数,二分即可。

最后的答案是 a n s − x × k ans-x\times k ansx×k,一定要记住了,是 k k k

代码

{% fold %}


{% endfold %}

你可能感兴趣的:(洛谷 5308 [COCI2019] Quiz 题解)