u++の備忘録

AtCoder「全国統一プログラミング王決定戦予選」をPythonで解く

atcoder.jp

C問題まで普通に解ける問題だったのに、妙な力みから些細なミスでWAを連発しました。猛省せねばです・・・。

f:id:upura:20190127230034p:plain

A - Subscribers(100点)

  • 最大値は、片方が片方を包含した場合なので、AとBの小さい方
  • 最小値は、両者を完全に分離した場合なので0か、Nの制約でできない場合は(A + B - N)
N, A, B = list(map(int, input().split()))

ans1 = min(A, B)
ans2 = max((A + B - N), 0)

print(str(ans1) + ' ' + str(ans2))

[追記]

[追記終わり]

B - Touitsu(200点)

  • 左から1文字ずつ、A・B・Cを比較していく
  • 変える必要がある文字数は
    • 現状がA・B・Cで全て違う場合は2
    • 何か一つだけ違う場合は1
    • 全て同じ場合は0
  • 綺麗に書ける気もしたが、クソみたいな条件分岐を書いた

[追記]

setで重複していない数を数えれば条件分岐は不要だった

[追記終わり]

N = int(input())
A = input()
B = input()
C = input()

ans = 0

for i in range(N):
    if A[i] == B[i]:
        if B[i] == C[i]:
            ans += 0
        else:
            ans += 1
    else:
        if B[i] == C[i]:
            ans += 1
        else:
            if C[i] != A[i]:
                ans += 2
            else:
                ans += 1

print(ans)

C - Different Strokes(400点)

  •  A_i + B_iがi番目の皿の価値
  • それぞれ価値が高い順に取っていく
import numpy as np
N = int(input())

A = []
B = []
val = []

for i in range(N):
    a, b = list(map(int, input().split()))
    A.append(a)
    B.append(b)
    val.append(a + b)

A = np.array(A)
B = np.array(B)
val = np.array(val)

sort_index = val.argsort()

A = (A[sort_index][::-1])
B = (B[sort_index][::-1])

taka = (A[0::2])
aoki = (B[1::2])

print(sum(taka) - sum(aoki))

参考

今回のコンテストは、下記の高橋社長のブログで言及されています。

chokudai.hatenablog.com