LoginSignup
0
0

More than 1 year has passed since last update.

Ants(POJ No.1852)の最小値を数式で書き下す

Posted at

プログラミングコンテストチャレンジブックの「気楽にウォーミングアップ」でさらっと解説されてる Ants(POJ No.1852) を数式に落とすとどうなるのか試してみた。最小値の方だけ書いてみたけど、このままだとプログラミングの勉強も進まないので、最大値はその気になったら書く。

Ants(POJ No.1852)
長さLcmの竿の上をn匹のアリが毎秒1cmのスピードで歩いています。
アリが竿の端に到達すると竿の下に落ちていきます。
また、竿の上は狭くてすれ違えないので、二匹のアリが出会うと、
それぞれ反対を向いて戻っていきます。
各アリについて、現在の竿の左端からの距離x_iはわかりますが、
どちらの方向を向いているのかはわかりません。
すべてのアリが竿から落ちるまでにかかる
最小の時間と最大の時間をそれぞれ求めなさい。

制約
1 <= L <= 10^6
1 <= n <= 10^6
0 <= x_i <= L 
L, n, x_i はすべて整数値

原題には書いてないですが、
向き・位置が同じ蟻がいた場合を弾くため x_i はすべて相異なるとしておきます。

問題の定式化

$L$, $n$, $x_i(i=1,...,n)$は定数とし、以下の議論では固定する。
この問題で問われている最小値は(1)で表される。
$$
\begin{equation}
\min_{d=(d_1,...d_n) \in \{Left, \ Right\}^n } \ \max_{i=1,...,n} f_i(d) \tag{1}
\end{equation}
$$

関数 $f_i$ は、$i=1,...,n$ について、$(Right,Left)$のいずれかの向き$d_i$を向く蟻 $A_i$ が、竿の端点まで到着する時刻(整数)を表す。

最小値を求める。

証明の方針:下界を求め、その値を実現するベクトル $d$ を構成することで、その下界が最小値であることを示す。

STEP1: 下界を求める。

$d$ , $i$ を任意の値にとる。$A_i$の左端までの距離 $x_i$ と、右端までの距離 $L-x_i$ のうち、短い方 $(=\min(x_i,L-x_i))$ 未満の距離を $A_i$ が歩いても、 $A_i$ が竿から落ちることない。よって以下の不等式が成立する。この式は $x_i=0$ の場合も成立する。
$$
\min(x_i,L-x_i) \leq f_i(d)
$$
この両辺に $\min_{d=(d_1,...d_n) \in \{Left, \ Right\}^n }\max_{i=1,...,n}$ を施しても不等号の向きは変わらないことと、左辺は $d$ の選択に依存しないことから式(1)の下界を得る。
$$
\max_{i=1,...,n} \min(x_i,L-x_i) \leq \min_{d=(d_1,...d_n) \in \{Left, \ Right\}^n }\max_{i=1,...,n} f_i(d) \tag{2}
$$

次に、この式の左辺が最小値であることを示す。

$$
\newcommand{\argmax}{\mathop{\rm arg~max}\limits}
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
$$

STEP2: 下界を実現する蟻の向きを構成する。

まず

LR_{min}(x) := \left\{
\begin{array}{ll}
Left & \big( x \leq \frac{L}{2}\big) \\
Right & \big( x > \frac{L}{2}\big)
\end{array}
\right.

$$
d_{min}:=(LR_{min}(x_i))_{i=0,...,n}
$$
と定義する。この値を蟻の向きのベクトル $d$ に選択する。このとき
$x_i \leq \frac{L}{2}$ を満たす $i$ の集合 $\it{I_L}$ について、蟻の速度は一定であることから以下が成り立つ。

$$
f_i(d_{min})=x_i=\min (x_i ,L-x_i) \ \ ( \ \forall i \in \it{I_L} \ )
$$

同様に $x_i > \frac{L}{2}$ を満たす $i$ の集合 $\it{I_R}$ について以下が成り立つ。

$$
f_i(d_{min})=L-x_i=\min (x_i ,L-x_i) \ \ ( \ \forall i \in \it{I_R} \ )
$$

が成立する。以上から

$$
f_i(d_{min})=\min (x_i ,L-x_i) \ \ ( \ i={1,...,n} \ )
$$

が成り立つ。よって

$$
\max_{i=1,...,n} f_i(d_{min}) = \max_{i=1,...,n} \min(x_i,L-x_i)
$$

この式はベクトル $d=d_{min}$ の選択が、(2)の左辺の下界の値を実現することを意味する。

以上から(2)の下界が最小値であることが示された。

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