ABC116D
ABC116D の解説
解答コード
https://atcoder.jp/contests/abc116/submissions/31604534
問題
いくつかの種類に分かれているN個の寿司の中からK個の寿司を食べた時のコスト関数を最大化する問題です.
コスト = おいしさの総和 + (食べた種類)^2
解説
公式解説の想定解は,初めに美味しいK個の寿司を食べると仮定した貪欲法を試みますが,初めにすべての種類の寿司を食べると仮定して実装しました.こうすることで,種類ボーナスの管理が簡単になると思います.
概要図です.
各種類1位にのネタをまず食べると仮定して配列A,
2位以下ネタをまとめて配列Bとします.
その後,Bの中にある寿司Bi(i=1, 2, ...)を食べた方が良いのかを判定していきます.
まだ食べる予定の寿司の個数がKに満たなければ,無条件でBiを食べることができます.
しかし,K個の寿司が食べる予定になっていれば,Aの中で最も不味いものを残ったBの中で最も美味しいものに入れ替えることで,種類ボーナスを上回る満足度が得られるかを貪欲に判定していきます.
あとは書くだけです.
概要図とソートの昇順降順が逆だったりしますが,そのままなので詳細は割愛します.
Parameters:
-----------
x : int
種類の数です.
capa : int
capacity のことです.あといくつ食べる余裕があるか.
以上,ABC116Dの解法でした.
<参考解説リンク>
公式: https://img.atcoder.jp/abc116/editorial.pdf