Codeforces Round #598 (Div. 3)E. Yet Another Division Into Teams
問題概要
人の人がおり, 番目の人の能力は である. ここから任意の個数のチームを作成するが, 各チームの人数は 人以上でなければならない.
チームの多様さをそのチームに属する人間の能力の最大値と最小値の差とする時, 全てのチームの多様さの和を最小にするにはどのように割り振れば良いか?
制約
解法
まず, 人間の能力でソートしましょう. 能力が小さい方からチームをまとめていく時, 実はチームの大きさは最大でも 人になることがわかります. この事実を簡単に以下に示します.
の 人でチームを組むことを考えます. なお, は広義単調増加です. このチームを と の二つのチームに分割する時, 分割する前と後で多様さは から に変化します. の単調性から, が成り立ちます. よって, 可能な限りチームを分割するのが最適です.
これに基づけば, が の倍数の時は全て 人チームにして仕舞えば良いです. の倍数ではない時は面倒なので, dp をしましょう. ( 人めまででチームを作った時の多様さの合計の最小値)とすれば, 自分が属しうるチームは定数個しかないので遷移も定数個しかないです.
実装
復元パート、いる?