Codeforces Round #521 (Div. 3)E. Thematic Contests
問題概要
あるトピックについて出題される問題が 個ある. 番目の問題はトピック について述べている. これらの問題をまとめて, 数日にわたるコンテストを開く. コンテストに出題する問題の制約は以下である :
- それぞれの日程について, その日一日に出題される問題のトピックはすべて同じであり, また同一のトピックについて二日以上出題することはできない.
- 日目に 問出題されたとすると, 日目には 問の問題を出題しなければならない( 日目は任意の個数の問題が出せる).
コンテストの日程を自由に決められるとき, 最大で合計何問の問題を出題することができるか?
制約
解法
出題しなければならない問題数はどんどん増えていくので, 最終日を最初に考えることにしましょう. まずは, 各トピックの種類数を std::map などでまとめ, 種類数の数列 をつくります. なお, は昇順にソートされていることにします.
さて, 最終日に選ぶべきトピックはどれでしょうか?これは, を選ぶことが最適です. 最終日に 以外を選ぶことによって, 出題できる問題の総数が増えることはないためです.
同様の議論から最終日から一日前に出題するべきトピックは であることもわかります. これを繰り返すと, もし 日間のコンテストを開きたいならば, のトピックからなるコンテストを開けばよいです. このとき, 出題できる問題数はもっとも問題がすくないトピックに合わせなければならないため, 初日に出題すべき問題数は であり, これさえわかればあとは初等的な計算で全体の問題数がわかります.
肝心の の部分ですが, 動的に を管理するようにすれば良いです. 具体的には実装をみてください. 発想はこれが近いと思います.