AtCoder Beginner Contest 181 / Python


f:id:penyooo:20200112235130p:plain


  • 独学者です。( 2019 / 9 ~ )
  • AtCoder の問題に Python で取り組んでいます。
  • ABC で4問目(茶か緑)まで解けることを目標にしています。

完全に独学なのでコードは酷いと思います。

AtCoder やってる方、お気軽にコメントください。





結果



f:id:penyooo:20201102015315p:plain

あれぇ?2問しか解けない病だぞ??

いやでもね、今日のは違うんよ、言い訳させて?

寝起きで頭働かなかったんよ。

ちょうど終わりころに目が覚めて来たんよ。

誰に向けて言い訳しとるん?

いやともかく、その後ちゃんと考えたら4問目まで自力で解けたから!







問題と解答と勉強


atcoder.jp

提出したコード
if int(input()) % 2 == 0:
    print("White")
else:
    print("Black")









atcoder.jp



提出したコード
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))









atcoder.jp



謎のねぇ、何故かねぇ、ここで詰まったんよねぇ。

何か変な嵌まり方をしていたらしく、終わってから自然に考えたら普通だった。

後で考えたコード
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')



これがスマートね。





atcoder.jp



後で考えたコード
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")



おぉ、機械らしい考え方・・・

こういうの思い付かないんよねぇ。

今回はどっちでも通るから良いんだけどさ。





atcoder.jp



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)









atcoder.jp



6問目は見ていない。