Port 53

明日のための技術メモ

パナソニックプログラミングコンテスト2020

パナソニックプログラミングコンテスト2020解いた分だけまとめ。
B,C問題でコーナーケースにはまり、AB2完だった。
C問題時間内に解きたかったなぁ...

レートはなんとか上がった。あともう少し。

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

目次

A. Kth Term

問題文 f:id:saturn-glave:20200315131831p:plain

問題文にある数列をそのままリストにして、k番目の要素を取り出す。
リストは0からカウントされるので、出力するのは num[k-1] になる

ACしたコード

#coding:utf-8
k = int(input())
num = [1, 1, 1, 2, 1, 2, 1, 5, 2, 2, 1, 5, 1, 2, 1, 14, 1, 5, 1, 5, 2, 2, 1, 15, 2, 2, 5, 4, 1, 4, 1, 51]
print(num[k-1])

B. Bishop

問題文 f:id:saturn-glave:20200315132148p:plain

マスの数が偶数なら、マスの数の半分、奇数ならマスの数の半分+1分だけ動けるが、
縦横どちらかが1の時は、最初にいる左上隅のマスにいるしかない。
移動回数は0回なので、その時は答えが1になる。
入力の範囲をよく見て極端な例でも証明してみるのが、コーナーケースを考慮する
ポイントらしい。ここで2WA食らった。勉強になります。

ACしたコード

#coding:utf-8
h, w = map(int, input().split())
area = h * w

if h == 1 or w == 1:
    print(1)
elif area % 2 == 0:
    print(area // 2)
else:
    print(-(-area // 2))

C. Sqrt Inequality

問題文 f:id:saturn-glave:20200315132657p:plain

ここから解説AC
問題文の通りに普通に実装すると案の定しんだ。
浮動小数点の誤差で爆死してしまうので、できるだけ整数に直してから判定する。

最後まで平方根を除くと、以下のような式になる

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

最後の式を使って判定したいところだが、 c - a - b < 0 の時は崩壊してしまうので、
その場合は除外する

ACしたコード

#coding:utf-8
import math
a,b,c = map(int, input().split())
x = c - a - b
#(c-a-b)^2  > 4abする時が答え
#ただし(c-b-a) < 0になるものは対象外

if x < 0:
    print('No')
elif x**2 > 4*a*b:
    print('Yes')
else:
    print('No')