AtCoderBeginnerContest119 C 問題 300 点 「Synthetic Kadomatsu 」
AtCoderBeginnerContest119 C 問題 300 点 「Synthetic Kadomatsu 」
問題概要
制約
解法
すべての竹に対して
- A を作るために使う
- B を。。。
- C を。。。
- 使わない
の4通りを試し、それぞれでできた竹と目標値との差分の和+合成した竹の数$\times$10 のうち最小値を取る。この時の差分は正負は関係ない(伸ばしても縮めてもコストは1なので)。深さ優先の問題だと思ったが実装がうまく行かなかったので 4bit で分類してそれぞれの 4 通りを試した。
お気持ち
AC コード
# coding: utf-8
def Base_10_to_n(X, n):
X_dumy = X
out = ''
while X_dumy>0:
out = str(X_dumy%n)+out
X_dumy = int(X_dumy/n)
return out
N, A, B, C = map(int, input().split())
L = [int(input()) for _ in range(N)]
ans = float("inf")
for i in range(4**N):
bits = Base_10_to_n(i, 4).zfill(N)
a, b, c = 0, 0, 0
cost = 0
for j in range(len(bits)):
if bits[j] == "0":
pass
elif bits[j] == "1":
a += L[j]
cost += 10
elif bits[j] == "2":
b += L[j]
cost += 10
else:
c += L[j]
cost += 10
if min(a, b, c) > 0:
ans = min(ans, cost + abs(a-A)+abs(b-B)+abs(c-C) - 10*3)
print(ans)