かしのブログ

競技プログラミングとか

Mujin Programming Challenge 2017 A - Robot Racing

問題

直線上を座標 x_i (x_i \lt x_{i+1})に並んだ N体のロボット R_iは、それぞれ次の操作が可能である。

  • 今いる座標 xから、座標 x-2, x-1の空いている好きな方に移動する

座標が0以下でゴールになる。 N体のロボットの順位としてありえるパターンを求める。

考察

 i \lt j R_j R_iよりも先にゴールするとき、座標 x−1が空席、座標 x R_iが、座標 x+1 R_jがいる状態になり、 j番目のロボットが座標 x−1に移動するような場面がある。ここで、 R_iが座標 x−1に移動すれば状況を入れ替えることができ、 i \lt jかつ R_j k位でゴールできるなら、 R_i k位かそれよりも良い順位でゴールできることを示せた。

次に、 i番目のロボットが1位でゴールできる時、 R_j (j \lt i)は座標 2j-1に並ぶことができ、またそのとき限り1位になれることを示す。

 R_j (j \lt i)が座標 2j-1に並べないとき R_iが1位にならないことを示す

 R_j (j \lt i)が座標 2j-1に並べないとき、座標 x_l \lt 2l-1 (l \lt i)なる R_lが存在する。 R_i R_lを飛び越え1位になるためには、それ以前のロボットが全て1つ以上のマスを開けて並ぶ必要があり、これを実現しようとすると少なくとも R_1がゴールしてしまう。よって、 R_j (j \lt i)が座標 2j-1に並べないとき1位にならない。

 R_j (j \lt i)が座標 2j-1に並ぶとき R_iが1位になれることを示す

 R_iについての帰納法で示す

  •  i \leq 2の時は自明
  •  i = k で成り立つとき、 i = k+1で成り立つことを示す

 R_j (j \lt k)を座標 2j-1に並べる(帰納法の仮定より可能)。 R_kの初期の座標が 2k-1以上のときのみ、 R_k 2k-1に移動できる。このとき、 R_k, R_{k+1}をそれぞれ座標 2k-1, 2kに移動できる。その後 R_{k+1}を1つ飛ばしで動かせば R_{k+1}が1位になれる。

以上より、 R_j (j \lt i)が座標 2j-1に並ぶとき R_iが1位になれる。したがって、 i番目のロボットが1位でゴールできる時、 R_j (j \lt i)は座標 2j-1に並ぶことができ、またそのとき限り1位になれることが示された。

また、 R_i の最高順位が k位のとき、 R_l (l \lt i)から k-1体除いた i-k+1体が座標 1, 3, \cdots, 2(i-k)+1に並ぶことができ、またそのときに限る。 このことから、 R_iの最高順位は R_{i-1}の最高順位か、それ +1だということもわかる。

以上から、それぞれのロボットの最高順位を求め、 \prod_{k = 1}^{N} (k位になれるロボットの数 - (k-1))を求めればよい。

実装

atcoder.jp