MUJIN プログラミングチャレンジ B – ロボットアーム をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
MUJIN プログラミングチャレンジ B – ロボットアーム

外側はいいとして、内側をどのように判定するかが問われる問題。図に書くと分かりやすいかも。

# MUJIN プログラミングチャレンジ B - ロボットアーム
# https://atcoder.jp/contests/mujin-pc-2016/tasks/mujin_pc_2016_b
# tag: 計算幾何

# 原点から一番離れる最大の範囲は、OA + AB + BC で問題無い。
# 最小がどうなるのかを考える。

# 原点を通ることが出来る = 最小距離を 0 にできるのは、
# OA, AB, BC で三角形をつくれるとき。
# この必要十分条件は、この3つの辺の長さを短い順に
# x, y, z としたとき、x + y >= z であること。

# また、逆に三角形を作れない場合、つまり x + y < z の時は、
# 原点に対して z - (x + y) の距離までしか近づくことが
# できないことになる。

import math
def main():
    l = list(map(int, input().split()))

    # 最長辺と、それ以外の辺の合計を出しておく
    mx = max(l)
    rest = sum(l) - mx

    # 最大の円の面積
    result = math.pi * sum(l)**2

    # 原点を通れない場合は、内側の円の面積を引く
    if rest < mx:
        result -= math.pi * (mx - rest)**2
    
    print(result)

main()

Share

コメントを残す

メールアドレスが公開されることはありません。