Different Strokes

全統2019予選-D "Different Strokes"

提出コード

atcoder.jp

考察

 X = 「最終的に高橋くんが得る幸福度の総和」ー「最終的に青木さんが得る幸福度の総和」とおきます.

問題の条件より, 2人は以下のような行動をします.

高橋くん: Xを最大化する

青木さん: Xを最小化する.


これを踏まえると,それぞれが i番目の料理を食べたとき,状況を以下のように変化させることができます.

高橋くん: X a [ i ]増やす(青木さんは X b [ i ]減らす権利を失う)

青木さん: X b [ i ]減らす(高橋くんは X a [ i ]増やす権利を失う)

高橋くん目線で考えます.

高橋くんは増やす分の a [ i ]はできるだけ大きく取りたいし,青木さんが減らす権利を失う分の b [ i ]もできるだけ大きく取りたいです.

 b [ i ]の値が大きいほど,青木さんが Xを減らせる度合いは小さくなるためです.

青木さんも同様で,減らす分の b [ i ]はできるだけ大きく取りたいし,高橋くんが増やす権利を失う分の a [ i ]もできるだけ大きく取りたいです.

つまり高橋くんから始めて,それぞれは a[ i ] + b[ i ]が大きいものから選んで料理を食べていけばいいです.


実装としては,例えば a[ i ] + b[ i ]と iをペアで持たせて, a[ i ] + b[ i ]で降順にソート.

 a[ i ] + b[ i ]が大きいindexから順に,

 X \leftarrow X + a[ 0 ] (高橋くんが料理を食べる)

 X \leftarrow X -  b[ 1 ] (青木さんが料理を食べる)

 X \leftarrow X + a[ 2 ] (高橋くんが料理を食べる)

 \vdots

とすれば答えが O(N)で出ます.

感想

最近の問題ABC187-Dにかなり似ていますね.

これをやっていた分解きやすかったです.