题意简述
有 $n$ 个人,$k$ 轮比赛。每次如果淘汰了 $x$ 个人,还剩下 $m$ 个人,得分增加 $\dfrac{x}{m}$ 的奖金。。假设你能控制每次淘汰多少人,最大化得分。
思路
设 $dp[i]$ 表示现在还剩下 $i$ 个人的最优方案 (先不考虑轮数)。
那么 $dp[i]=max(dp[j]+\dfrac{i-j}{i})$,其中 $0\le j<i$
显然能斜率优化。
觉得不显然的小伙伴们看一下:
斜率优化式子:
若 $j\ge k$ 且 $j$ 优于 $k$,那么
$dp[j]+\dfrac{i-j}{i}>dp[k]+\dfrac{i-k}{i}$
$dp[j]-\dfrac{j}{i}>dp[k]-\dfrac{k}{i}$
$dp[j]-dp[k]>\dfrac{j-k}{i}$
由于 $j\ge k$,所以 $j-k>0$,直接除
$\dfrac{dp[j]-dp[k]}{j-k}>\dfrac{1}{i}$
也就是 $slope(k,j)>\dfrac{1}{i}$ 时,$k$ 就没用了。
而如果每一个时刻 $k$ 没用了,后面 $i$ 更大,$\dfrac{1}{i}$ 更小,$k$ 更不可能有用。这个是弹队首的条件。
其次可以看出来,这个队列是斜率单调递减的。这个就是加入队尾的条件。
然后我们就发现一个问题:$k$ 的限制怎么办?
上 $wqs$ 二分: 对于每个转移过来的 $j$,我们给他加上一个附加权值 $x$。显然,$x$ 加的越多,选的段数越少。转移的时候记录一下段数,二分即可。
最后的答案是 $ans-x\times k$,一定要记住了,是 $k$。
代码
1 |
|