AtCoder Regular Contest 085 E - MUL
問題
個の宝石があり、個目の宝石の価値は(負の可能性もある)である。以下の操作を0回以上したとき、残っている宝石の価値の総和の最大値を求める。
- 正整数を選び、の倍数の宝石を全て割る
考察
各宝石を割らないグループと割るグループに分類する問題と捉える。
の大きさによって以下のような気持ちになる。
- のとき割らない方がいい
- のとき割ったほうがいい
また、操作は、「宝石が割られているのなら、宝石も割らないといけない」という制約とみなす。 これらより、次のようなペナルティを与える問題として、そのペナルティの最小化を目標とする。
- なる宝石がに属さないなら、ペナルティ
- なる宝石がに属さないなら、ペナルティ
- なる宝石がに属し、宝石がに属さないならペナルティ
グラフのカットの容量の最小化なので、双対問題である最大フロー問題として解くことができる。具体的には、宝石に対応する頂点と、頂点を用意し、
- のとき、
- のとき、
- のとき、
という辺を貼り、頂点間の最大フローを求める。これは発生する最小のペナルティなので、制約を無視して得られる最大得点からペナルティを引くと、価値の総和の最大値が得られる。