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()
関連