LoginSignup
0
0

More than 3 years have passed since last update.

解法メモ AtCoder Grand Contest 023 C - Painting Machines

Last updated at Posted at 2020-08-11

公式解説ほど鮮やかではありませんが、別の方法でもそれほど面倒ではなく解けたので、その解法をメモします。

問題文:AtCoder Grand Contest 023 C - Painting Machines

解法

ちょうど$K$個稼働したときに全部塗れるような順列の個数$g(K)$を数えられれば、答はそれにスコア$K$を重みづけ和することで求まる。

\prod_K K*g(K)

以下では$g(K)$をいかに求めるかを考える。

全部塗れたときの稼働マシンと未稼働マシンの並び方を考えると、未稼働マシンは、

  • 端にない
  • 連続しない

という2つの条件を満たした状態になっている。しかし、逆に2条件を満たしても、ちょうど$K$個稼働したときに全部塗り終わったとは限らない。$K$個目を稼働する前に全部塗れていることがある。ここで公式解説では($K$のときの値)-($K-1$のときの値)とすることでちょうど$K$個のときの値である$g(K)$を求めているが、自分は思いつかなかった。

自分が考えたのは、直前である$K-1$個稼働時の状態。その時点では全部塗れておらず、次の1つを稼働すると全部塗れる状態である。これは以下の3通りである:

(1) 端1つ未稼働
左右端のマシンはどちらか一方だけ未稼働。端以外のマシンで、未稼働なものが連続することはない、という状態。次に端のマシンを稼働すれば全部塗れる。
(2) 2連続未稼働
左右端のマシンは両方稼働。未稼働マシンのうち2つが連続し、他は連続しない、という状態。次に2連続未稼働マシンのどちらかを稼働すれば全部塗れる。
(3) 3連続未稼働
(2)と同様で、未稼働マシンが2連続ではなく3連続のもの。次に3連続の中央のマシンを稼働すれば全部塗れる。

image.png

後は、上記(1)~(3)に該当する順列の個数(それぞれ$g_1(K),$ $g_2(K),$ $g_3(K)$とする)を数えればよい。$g_1(K)$~$g_3(K)$は以下の通り計算できる。以下、$K-1$個稼働時の未稼働マシンの数を$r=N-K$と置く。

g_1(K) = 2 *  {}_{K-1}C_{r-1} * (K-1)! * 1 * (r-1)!
意味
$2$ 左右どちらの端が未稼働か
${}_{K-1}C_{r-1}$ 稼働マシンの隙間に未稼働マシンを挿入する組合せ
$(K-1)!$ 稼働マシン$K-1$個の稼働順序
$1$ $K$番目に稼働するのは端のマシン一択
$(r-1)!$ 残りの未稼働マシンの稼働順序
g_2(K) = {}_{K-2}C_{r-1} * (r-1) * (K-1)! * 2 * (r-1)!
意味
${}_{K-2}C_{r-1}$ 稼働マシンの隙間に未稼働マシンを挿入する組合せ(連続する2つはまとめて1つと考える)
$r-1$ 未稼働マシンを2つ入れる場所の選択
$(K-1)!$ 稼働マシン$K-1$個の稼働順序
$2$ $K$番目に稼働するのは2連続の未稼働マシンのどちらか
$(r-1)!$ 残りの未稼働マシンの稼働順序
g_3(K) = {}_{K-2}C_{r-2} * (r-2) * (K-1)! * 1 * (r-1)!
意味
${}_{K-2}C_{r-2}$ 稼働マシンの隙間に未稼働マシンを挿入する組合せ(連続する3つはまとめて1つと考える)
$r-2$ 未稼働マシンを3つ入れる場所の選択
$(K-1)!$ 稼働マシン$K-1$個の稼働順序
$1$ $K$番目に稼働するのは3連続の中央のマシン一択
$(r-1)!$ 残りの未稼働マシンの稼働順序

以上より、$g(K)=g_1(K)+g_2(K)+g_3(K)$で$g(K)$が求まり、答が求まる。

感想

場合分けの「3連続未稼働」に気づかず、かなりはまってしまいました。それでも体感的には他の橙diffより易しく感じました。
公式解説の「ちょうどK個=K個以下-K-1個以下」という考え方はおそらく重要なので、これをスムーズに引き出せなかったところは反省点です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0