AtCoder「全国統一プログラミング王決定戦予選」をPythonで解く
C問題まで普通に解ける問題だったのに、妙な力みから些細なミスでWAを連発しました。猛省せねばです・・・。
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))
[追記]
printはカンマで区切ると自動でスペース1つ入れてくれますよ!
— えじ|Amane Suzuki (@SakuEji) January 27, 2019
[追記終わり]
B - Touitsu(200点)
- 左から1文字ずつ、A・B・Cを比較していく
- 変える必要がある文字数は
- 現状がA・B・Cで全て違う場合は2
- 何か一つだけ違う場合は1
- 全て同じ場合は0
- 綺麗に書ける気もしたが、クソみたいな条件分岐を書いた
[追記]
setで重複していない数を数えれば条件分岐は不要だった
A: min(a,b)とmax(0, a+b-n)
— えじ|Amane Suzuki (@SakuEji) January 27, 2019
B: i文字目ごとにset([a, b, c])-1個変えなきゃだめ
C: 高橋くんが最も得をするとき青木さんは最も損をします。逆も然りなのでa+bでソートして交互に取っていく
D: トポロジカルソートしてパスを長くするように探索です……なぜかソート不要じゃん!と思い込んで無限WA
[追記終わり]
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点)
- が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))