Port 53

明日のための技術メモ

AtCoder ABC168

AtCoder ABC168解いた分だけまとめ。
ABC3完。C問題で10年ぶりくらいに余弦定理出てきて吹いた。

目次

A. ∴ (Therefore)

f:id:saturn-glave:20200517231514p:plain

問題文

問題文に従ってif文で場合分けするだけ。
入力を文字列で受けとり、スライスn[-1]して最後の文字を見て場合分け

ACしたコード

# coding:utf-8
n = input()
if n[-1] == '2' or n[-1] == '4' or n[-1] == '5' or n[-1] == '7' or n[-1] == '9':
    print('hon')
elif n[-1] == '0' or n[-1] == '1' or n[-1] == '6' or n[-1] == '8':
    print('pon')
else:
    print('bon')

B. ...(Triple Dots)

f:id:saturn-glave:20200517231713p:plain

問題文

やるだけ。文字列の長さを取っておいて、比較する。
スライスと文字列の結合ができればおしまい。

ACしたコード

実際提出したのは n = len(s)を事前に取ってからやってたけど、 セイウチ演算子でもできるので後で直しました。

# coding:utf-8
k = int(input())
s = input()

if (n := len(s)) <= k:
    print(s)
else:
    print(s[0:k] + '...')

C. :(Colon)

f:id:saturn-glave:20200517231923p:plain

問題文

ここに来て余弦定理が出てきた。

まず、時計が出てくる問題で基本となることから。
以下の条件を加味して、分針と時針のつくる角度を求める。

  • 今回の問題の場合、時針と分針どちらが長いとは書いてない。
  • 時針は0.5°/分、分針は6°/分ずつ動く
  • 時針は1時間で30°動く
  • 今回分針と時針の作る角度は、小さい方の角度を求める
    • 余弦定理を使って答えを求めることができる

ポイント

ACしたコード

# coding:utf-8
import math
a, b, h, m = map(int, input().split())

md = m // 5
md_min = m % 5
th = abs((30 * h + 0.5 * m) - (m * 6))

theta = min(th, 360 - th)
# print(theta)
ans = (a ** 2 + b ** 2 - 2 * a * b * math.cos(math.radians(theta))) ** 0.5
print(ans)

参考

w3e.kanazawa-it.ac.jp

note.nkmk.me