u++の備忘録

AtCoder Beginner Contest 119をPythonで解く

AtCoder Beginner Contest 119」に出て、3完でした。

atcoder.jp

C問題の実装に苦しみ、時間をほぼ使ってクソコードで通しました。

f:id:upura:20190224224046p:plain

A - Still TBD(100点)

  • 文字列の比較
S = input()

if S <= "2019/04/30":
    print("Heisei")
else:
    print("TBD")

B - Digital Gifts(200点)

  • 一つずつ、条件分岐して足し上げる
  • [float, str]という入力列が来るので、取りあえず両方strで受け取って、計算時にfloatに戻してあげる
N = int(input())

A = []
for i in range(N):
    A.append(list(input().split()))

ans = 0
for a in A:
    if a[1] == 'JPY':
        ans += float(a[0])
    else:
        ans += float(a[0]) * 380000.0

print(ans)

C - Synthetic Kadomatsu(300点)

  • 愚直に要件通りに実装する
  • 1回目の提出で最後のテストケースだけREになったので、恐らくエラーの発生した箇所を特定し、try~exceptも使ったクソコード
import itertools
import numpy as np
import copy


ansl = []
N, A, B, C = list(map(int, input().split()))

a = []
for i in range(N):
    a.append(int(input()))

def get_ptn(la):
    ptn = []
    for i in range(1, len(la) + 1):
        ptn.append(list(itertools.combinations(la, i)))
    return ptn

takes = list(itertools.permutations([A, B, C]))

for take in takes:
    try:
        ta = copy.deepcopy(a)
        ans = 0
        for k in range(3):
            ptn = get_ptn(ta)

            cost = []
            tmp = []
            for i in range(len(ptn)):
                tmp.append([abs(take[k] - sum(j)) for j in ptn[i]])
                cost.append(min(tmp[i]) + 10 * i)
            ans += min(cost)
            ac = np.argmin(cost)
            at = np.argmin(tmp[ac])

            for _ in ptn[ac][at]:
                ta.remove(_)

        ansl.append(ans)
    except:
        pass

print(min(ansl))