题意简述
有 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]+ii−j),其中 0 ≤ j < i 0\le j<i 0≤j<i
显然能斜率优化。
觉得不显然的小伙伴们看一下:
{% fold %}
斜率优化式子:
若
j
≥
k
j\ge k
j≥k 且
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]+ii−j>dp[k]+ii−k
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]>ij−k
由于
j
≥
k
j\ge k
j≥k,所以
j
−
k
>
0
j-k>0
j−k>0,直接除
d
p
[
j
]
−
d
p
[
k
]
j
−
k
>
1
i
\dfrac{dp[j]-dp[k]}{j-k}>\dfrac{1}{i}
j−kdp[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 ans−x×k,一定要记住了,是 k k k。
代码
{% fold %}
{% endfold %}