AtCoder Beginner Contest 419 C - King's Summit
AtCoder Beginner Contest 419 C - King's Summit
問題はこちら
問題を解く時の思考の流れ
-
人の人にとって一番都合のいいマスがわかると嬉しいN -
1 を求めるためには、全探索だとマスの数だけかかり、グリッドの大きさは
行10^9 列のため間に合わなさそう10^9 -
そもそも2次元で複雑な気がするので、1次元で考えてみたい
-
1次元の場合で考えてみる
a.
軸上にx 人の人がおり、はじめM 人目はマスi にいるとするx_i b. この場合、都合のいいマスは、「みんなにとっての中心っぽい」場所にありそう
c. b をより具体的に考えてみると、一番離れている人たちの真ん中が都合のいいマスになりそう
d. 具体的には、
のような場合、マスx = [5, 1, 3, 6, 9, 2] にいる人とマス1 にいる人の真ん中が最適な場所になりそう。これは、マス9 と1 以外の場所にいる人は、マス9 や1 にいる人よりも早く最適な場所へ移動できるから。9 -
1次元の場合はうまくいきそうだけど、2次元の場合も同じように考えられるか。
軸とx 軸は独立して考えられそうなので、それぞれの軸方向に対して 4 と同じことを考えれば良さそう。y 近傍のマスへ移動できるので、どちらの軸方向にも同時に8 マス動ける。1 つまり、答えは
軸の最小値と最大値の差と、x 軸の最小値と最大値の差の大きい方をy で割ったものになりそう。2 -
5 において、
で割り切れなかった場合はどうなるだろうか。2 で割り切れる場合は真ん中を全員が集まるマスとして、一番離れている人がそのマスまで移動にかかる時間を出力すればいいが、2 で割り切れない場合は下記具体例のようになる。2 <具体例>
再度一次元で考えてみると、一番離れている人がマス
とマス1 にいた場合、全員が集まるマスとしてはマス6 かマス3 が選ばれる。マス4 が選ばれた場合は、マス3 にいた人は時刻1 にマス2 についているが、マス3 にいた人は時刻6 にマス3 に到着する。一方、マス3 が選ばれた場合は、マス4 にいた人は時刻1 にマス3 についているが、マス4 にいた人は時刻6 にマス2 に到着する。4 このように、最適なマスに集まる時間がズレるので、
で割るのではなく、2 で切り上げ除算をする必要がある。2
実装
慣例に則り、問題文中で大文字となっている変数名も全て小文字にしているので注意してください。
n = int(input())
r = [0 for _ in range(n)]
c = [0 for _ in range(n)]
for i in range(n):
tmp_r, tmp_c = map(int, input().split())
r[i] = tmp_r
c[i] = tmp_c
tmp = max(max(r) - min(r), max(c) - min(c))
# 切り捨て除算
if tmp % 2 == 0:
print(tmp // 2)
else:
print(tmp // 2 + 1)
教訓
- 理想の状態から考えてみる
- 次元を落として考えてみる
おまけ
移動できるマスが、
この場合は、いずれか片方の軸方向にしか同時には移動できないので、答えは
n = int(input())
r = [0 for _ in range(n)]
c = [0 for _ in range(n)]
for i in range(n):
tmp_r, tmp_c = map(int, input().split())
r[i] = tmp_r
c[i] = tmp_c
ans = 0
tmp_r = max(r) - min(r)
if tmp_r % 2 == 0:
ans += tmp_r // 2
else:
ans += tmp_r // 2 + 1
tmp_c = max(c) - min(c)
if tmp_c % 2 == 0:
ans += tmp_c // 2
else:
ans += tmp_c // 2 + 1
print(ans)
おまけが間違ってたら連絡ください🙏
Discussion