physics0523's 精進ログ

主に競プロの面白い問題の解法をメモします

Stoned Game(CFR666-D1B)

Problem - B - Codeforces

この手の問題死ぬほど苦手。1800diffなのに分からなかった…

 

問題概要

石を積んだ山が $N$ 個ある。

$i$ 個目の山に石が $A_i$ 個積んである。

プレイヤーは交互に山を $1$ つ選んでそこから石を $1$ つ取るが、前のプレイヤーと同じ山から石を取ってはならない(最初の先手だけはどこから石をとってもよい)

先手と後手どちらが勝つか?

$1 \le N \le 100$

$1 \le A_i \le 100$

 

山ごとのパリティを考えたのがドブだった…

 

このゲームのカギは「過半数」と「完全マッチング」。

(i) 過半数の石を持つ山がある場合

先手必勝。先手が最多数の石を持つ山から石をとってしまえば、手番が回ってくればそこから取るのを繰り返せば勝てる。

(ii) 過半数の石を持つ山が無い場合

(ii)-1 石の総数が偶数の場合

後手必勝。石の総数が偶数かつ過半数の石を持つ山がないので、相異なる山にある石同士で完全マッチングが成立し、先手の行動に合わせて後手は適切な山から石を取れる。

(ii)-2 石の総数が奇数の場合

先手必勝。先手は最初適当な山から石を取り(どうやっても「石の総数が偶数かつ過半数の石を持つ山がない」状況に出来る)、その後、後手の着手に対して(先手後手が入れ替わった状況で)先述の完全マッチングに従い石を取っていけばよい。

 

ゲームってなんか解けないと悲しくなりませんか?苦手です…

Submission #138203599 - Codeforces