AtCoder Beginner Contest 181 / Python
結果
あれぇ?2問しか解けない病だぞ??
いやでもね、今日のは違うんよ、言い訳させて?
寝起きで頭働かなかったんよ。
ちょうど終わりころに目が覚めて来たんよ。
誰に向けて言い訳しとるん?
いやともかく、その後ちゃんと考えたら4問目まで自力で解けたから!
問題と解答と勉強
提出したコード
if int(input()) % 2 == 0: print("White") else: print("Black")
提出したコード
N = int(input()) ans = 0 for _ in range(N): A, B = map(int, input().split()) ans += B*(B+1)/2 - (A-1)*A/2 print(int(ans))
謎のねぇ、何故かねぇ、ここで詰まったんよねぇ。
何か変な嵌まり方をしていたらしく、終わってから自然に考えたら普通だった。
後で考えたコード
import itertools N = int(input()) XY = [list(map(int, input().split())) for _ in range(N)] Flag = False for A, B, C in itertools.combinations(XY, 3): if B[0] - A[0] == 0: if A[0] == C[0]: Flag = True break elif B[1] - A[1] == 0: if A[1] == C[1]: Flag = True break else: if C[1]-A[1] == (C[0]-A[0])*(B[1]-A[1])/(B[0]-A[0]): Flag = True break if Flag == True: print("Yes") else: print("No")
言われたことを特に工夫も無くやってるだけなんよね。
何でこれに詰まっていたのだろうか。
ちなみにこれはどうやら数学的にちょっとダサいようで。
スマートなやつ
import itertools n = int(input()) xy = [list(map(int, input().split())) for _ in range(n)] for com in itertools.combinations(xy, r=3): (x1, y1), (x2, y2), (x3, y3) = com if (x1 - x2) * (y2 - y3) == (x2 - x3) * (y1 - y2): print('Yes') exit() print('No')
これがスマートね。
後で考えたコード
import itertools import sys s = list(input()) S = [] for i in range(1,10): if s.count(str(i)) < 3: S += [str(i)]*s.count(str(i)) else: S += [str(i)]*3 if len(S) == 1: if int(S[0]) % 8 == 0: print("Yes") sys.exit() if len(S) == 2: if int(S[0]+S[1]) % 8 == 0 or int(S[1]+S[0]) % 8 == 0: print("Yes") sys.exit() for j in itertools.permutations(S, 3): if int(''.join(j)) % 8 == 0: print("Yes") sys.exit() print("No")
全通りやるのは時間で引っ掛かったけど、
下3ケタで考えるから、3つ以上同じ数字は要らんので排除、
それだけで通った。
あのね、簡単なんよね。
なぜ今回2問しか解けなかったのか・・・
ちなみに僕のはとても人間らしい考え方をしているが、
どうやらこの問題は人間らしくないのが正解らしい。
コンピュータ流
from collections import Counter n = input() if len(n) <= 2: if int(n) % 8 == 0 or int(n[::-1]) % 8 == 0: print("Yes") else: print("No") exit() cnt = Counter(n) for i in range(104, 1000, 8): if not Counter(str(i)) - cnt: print("Yes") exit() print("No")
おぉ、機械らしい考え方・・・
こういうの思い付かないんよねぇ。
今回はどっちでも通るから良いんだけどさ。
TLEなるやつ
N, M = map(int, input().split()) H = list(map(int, input().split())) W = list(map(int, input().split())) ans = [] for i in W: h = H + [i] h.sort() wa = 0 for j in range(N//2+1): wa += h[2*j+1]-h[2*j] ans.append(wa) print(min(ans))
流石に何の工夫も無しは通らん。
そしてこれは工夫の仕方がわからんかったので、
今回はここまで。
ちなみに工夫は二分探索を使えば良かったっぽい。
勉強用(通るやつ)
import bisect n, m = map(int, input().split()) h = list(map(int, input().split())) w = list(map(int, input().split())) h.sort() sum1 = [h[i+1] - h[i] for i in range(n-1)] sum2 = sum1[1::2] + [0] sum1 = [0] + sum1[::2] for i in range(len(sum1) -1 ): sum1[i+1] += sum1[i] for i in range(len(sum2) -1, 0, -1): sum2[i-1] += sum2[i] ans = 10**20 for v in w: x = bisect.bisect(h, v) if x%2: x -= 1 cost = sum1[x//2] + sum2[x//2] + abs(h[x] - v) ans = min(ans, cost) print(ans)
6問目は見ていない。