解题思路
收益是价值和加上类型数的平方,所以既要贵的花,也可能要更多类型。类型奖励不是线性的,需要枚举最终用了多少种。
- 若选了某个类型,最优解一定包含该类型里价值最大的那一朵,其余按价值从大到小再拿。因此每种花排好序后只需考虑前缀。
- 把所有类型按「该种最贵的一朵」从大到小排列。可以证明:存在最优解,其类型集合恰好是这个序列的某个前缀。
- 设前缀长度为 C,则这 C 种各拿最贵的一朵,还要再拿 r=k−C 朵,只能从这 C 种剩下的花里选最大的 r 朵。前缀里花的总数不足 k 则不可行。
- 每多加入一种,把该种除最大朵以外的花放进大根堆;当前计入的 r 朵用小根堆维护,使它始终是已解锁续选花中最大的 r 朵。枚举 C 取最大的 S+C2。
- 常见假解:种类越多越好;直接取价值前 k 大再加种类平方;用
int 累加(价值和可到 1014,种类平方可到 1010)。