AcWing 734 能量石

题目传送门

一、贪心(微扰) + \(dp\)

这道题还是比较难的,前置知识:

贪心的微扰(邻项交换)证法,例题:国王游戏耍杂技的牛

贪心将问题转化:

发现有可能存在最优解的某些宝石的贡献为\(0\),我们剔除了这些宝石。

假设最优解的能量石排列长度为\(k(1<=k<=n)\) 因为去掉了那些没有贡献的宝石,位置为:

\(a1,a2,a3…aka1,a2,a3…ak\)。

那么对于任意两个位置\(i=a_l,j=a_l+1\)(\(1<=l<k\)),交换后两个宝石的贡献总和不会变得更大,即(假设之前的总时间为\(t\)):

\(E_i−t∗L_i+E_j−(t+S_i)∗L_j>=E_j−t∗L_j+E_i−(t+S_j)∗L_i\)

整理后:

\(S_i∗L_j<=S_j∗L_i\)

我们可以把跟\(i\)有关的放到一边,调整一下:

\(S_i/L_i<=S_j/L_j\)

这样,我们只要以如上条件作为宝石间排序的条件,进行一次\(sort\)。

因为对于其他形式的放置规律,必然可以通过交换满足SiLi>SjLjSiLi>SjLj的相邻的两项来得到更小值。

那么最优解的坐标(新的坐标)一定满足:

ai<a2<a3…<akai<a2<a3…<ak
dp
那么,我们只要搞个0101背包,SiSi作为费用,max(0,Ei−(t−Si)∗Li)max(0,Ei−(t−Si)∗Li) 作为价值 (tt为当前花费时长)。

f[t]f[t] 表示当前正好花tt时间得到的最大能量。

状态转移方程:

f[t]=max(f[t],f[t−Si]+max(0,Ei−(t−Si)∗Li))f[t]=max(f[t],f[t−Si]+max(0,Ei−(t−Si)∗Li))
由于我们背包放物品(宝石)的顺序是坐标从11到nn的,所以一定能枚举到最优解。

初始状态:f[0]=0f[0]=0,其余为负无穷

答案:max(f[i])(1<=i<=∑ni=1si)

上一篇:cmd下修改注册表完全攻略


下一篇:「python」2020十大Python函式库有哪些?快来看看~(1)