全国統一プログラミング王決定戦予選C - Different Strokes


解法1. 式変形

参考記事[1]の方法.


すべての料理の集合を$\Omega$,先手が選ぶ料理の集合を$X$,後手が選ぶ集合を$Y$とする.先手が最大化したいのは

\begin{aligned}
& \sum_{i\in X} A_{i} - \sum_{i\in Y} B_{i}
&= \sum_{i\in X} (A_{i} + B_{i}) - \sum_{i\in \Omega} B_{i}
\end{aligned}
であり,後手が最大化したいのは
\begin{aligned}
& \sum_{i\in Y} B_{i} - \sum_{i\in X} A_{i}
&= \sum_{i\in Y} (A_{i} + B_{i}) - \sum_{i\in \Omega} A_{i}
\end{aligned}
である.

$\sum_{i\in \Omega} A_{i}, \sum_{i\in \Omega} B_{i}$は定数なので,先手は$\sum_{i\in X} (A_{i} + B_{i}) $を最大化するような$X$を選び,後手は$\sum_{i\in Y} (A_{i} + B_{i})$を最大化するような$Y$を選ぶ問題になる.

先手・後手に関わらず,最大化する対象が同じになるのがポイント.

Pythonでは,$A_{i} + B_{i}$を降順にソートしたリストをlとすれば,$\sum_{i\in X} (A_{i} + B_{i}) =$sum(l[::2])と計算できる.


参考