ARC212-D
部屋割りを $ s_i ∈ {1, -1}(X / Y)で表す。
各人 $ i の満足度を $ b_i = \sum_j A_{i,j} s_jと定義すると、条件は $ s_i b_i \geq 0で表せる。
不満な人($ s_i b_i \lt 0)がいれば,その人の部屋を反転する($ s_i ← -s_i)。
目的関数を $ F = \sum_{i<j} A_{i,j} s_i s_jとすると、$ s_iを反転したとき $ \nabla F = -2 s_i b_i \gt 0となって$ Fは必ず増加する。
$ F は整数で上限があるため、この操作は有限回で停止する。
停止時には全員が $ s_i b_i \geq 0を満たし,条件を達成している。