パ研合宿2020 第1日「SpeedRun」に参加してみた
はじめに
この前、AtCoderで開催された パ研合宿2020 第1日「SpeedRun」 に参加しました。1時間ちょっとで私用で離脱し、結果は7完1700点でした。
A パ研合宿2020
2021を出力するだけです。
print(2021)
B パ研合宿2403
最初は文字列のリストとして受け取り、それを数値に変換して最大値を得ました。
x = list(input()) x = list(map(int,x)) print(max(x))
C 皆勤賞
連想配列で毎日参加した人数を数えました。
n = int(input()) dic = {} for i in range(n): k = int(input()) s = list(input().split()) for j in range(k): try: dic[s[j]] += 1 except: dic[s[j]] = 1 ans = 0 for i in dic.values(): if i == n: ans += 1 print(ans)
E Amary
解説を見るともっと簡略化できたようです。
両方同じ値だと実現不可能。あとは細かく分岐してごり押ししました。
x,y = map(int,input().split()) if x == 0 and y == 0: print(1,1) exit(0) if x == 0: print(y*2,y) exit(0) if y == 0: print(x,x*2) exit(0) if x == y: print(-1) exit(0) if x > y: print(x,x+y) else: print(x+y,y)
F Fibonaccyan
与えられる値が 3000 までなので、フィボナッチ数を 3000 まで求めたらいいのかなと思いました。嘘解法な気がします。
p = int(input()) f = [0] * 3000 f[1],f[2] = 1,1 for i in range(3,3000): f[i] = f[i-2] + f[i-1] for i in range(1,3000): if f[i] % p == 0: print(i) break
G 同意書
各メンバーが同意書を出した、出していないで全探索しました。
n,m = map(int,input().split()) l = [] r = [] s = [] for i in range(m): x,y,z = map(int,input().split()) l.append(x) r.append(y) s.append(z) ans = -1 for p in range(2**n): x = p f = [0] * (n+1) i = 1 while x > 0: if x & 1: f[i] = 1 x >>= 1 i += 1 flg = True for i in range(m): x = 0 for j in range(l[i],r[i]+1): x += f[j] if x != s[i]: flg = False break if flg: ans = max(ans,sum(f)) print(ans)
J Output-only
ピタゴラス数になるような数は何?で検索すると解説にもある公式が出てきました。その公式を使って、条件を満たしていたら出力し、10万回出力したら終了させました。
from math import gcd x = 0 for m in range(1,1000): for n in range(1,m): a = m**2-n**2 b = 2*m*n c = m**2+n**2 if a < b < c: if gcd(gcd(a,b),c) == 1: print(a,b,c) x += 1 if x == 10**5: exit(0)
感想
ABC級の問題が15問、制限時間が2時間と、とても大変でした。
500点、600点問題が全く解けていないので、この点数帯が解けるよう精進していきたいです。