码迷,mamicode.com
首页 > 其他好文 > 详细

#0013.「Codeforces」1354F Summoning Minions

时间:2020-05-21 23:56:58      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:def   个数   through   记录   sum   str   就是   ext   排列   

题目大意:

  n个小黄人!每个小黄人有初始战斗值a和另一个值b。每次召唤一个小黄人i可以使前面召唤的所有小黄人战斗值加bi。每个小黄人可以被雇佣和解雇任意一次。需要保证任意情况下队伍内小黄人的数量不超过m。输出任意一个最优的操作序列。

  m<=n<=75

  多测,T<=75

题目解法: 

  (好喜欢这道题www

  首先看到这种题的第一反应就是排序后dp。

  观察1:最后的操作序列一定是 雇佣(m-1)个+雇佣后解雇(n-m)个+雇佣1个

  因为我们最后只有m个小黄人在队伍中,显然有n-m个是无法雇佣的。对于这n-m个小黄人,他们的贡献显然只有b的加成。所以显然我们要让这样的操作尽可能后。为了保证随时不超过m个小黄人,显然我们只能采取上述操作。

  //这个观察使我们在dp中对于每个小黄人有 最终雇佣 和 雇佣后被解雇掉 两种转移方法。

  观察2:最终雇佣的m个小黄人b值一定递增。

  a值直接求和和顺序无关显然。而b值的贡献显然是和顺序有关的。越往后雇佣的可以给更多的小黄人加战斗值,所以显然按b值递增处理最优。

  观察3:不在最终队伍中的小黄人都对答案贡献(m-1)*bi


 

  综上所述,我们可以得到一种有效的算法:

  先将所有小黄人按b升序排列。

  f(i,j)表示考虑前i个小黄人有j个在最终队伍里的最大战斗力。

  f(i,j)=max{f(i-1,j)+(m-1)*bi, f(i-1,j-1)+(j-1)*ai},再用一个数组记录每个f(i,j)是从f(i-1,j)还是f(i-1,j-1)转移过来的。这样就可以得到最大战斗值了。

  复杂度O(T*n*m)

  

#0013.「Codeforces」1354F Summoning Minions

标签:def   个数   through   记录   sum   str   就是   ext   排列   

原文地址:https://www.cnblogs.com/myrcella/p/12934360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!