結果
| 問題 |
No.967 引き算をして門松列(その2)
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 20:43:01 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,814 bytes |
| コンパイル時間 | 198 ms |
| コンパイル使用メモリ | 82,192 KB |
| 実行使用メモリ | 84,524 KB |
| 最終ジャッジ日時 | 2025-03-20 20:43:09 |
| 合計ジャッジ時間 | 3,965 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | WA * 10 |
ソースコード
import sys
INF = float('inf')
def compute_min_cost(A, B, C, X, Y, Z):
patterns = []
# Pattern 1: A > C > B'
def pattern1():
min_cost = INF
min_b = max(0, B - (C - 1))
max_b = B - 1
if min_b > max_b:
return INF
candidates = [min_b, max_b]
for delta in [-1, 0, 1]:
c_b = B - (A - 2) + delta
if c_b >= min_b and c_b <= max_b:
candidates.append(c_b)
candidates = list(set(candidates))
for b in candidates:
if b < min_b or b > max_b:
continue
B_prime = B - b
if B_prime < 1:
continue
C_prime = B_prime + 1
c = C - C_prime
if c < 0 or (C - c) < 1:
continue
required_A_prime = C_prime + 1
if required_A_prime < 1:
continue
a = max(0, A - required_A_prime)
A_prime = A - a
if A_prime < 1:
continue
if A_prime > C_prime and C_prime > B_prime and (A_prime != C_prime) and (C_prime != B_prime) and (A_prime != B_prime):
cost = a * X + b * Y + c * Z
if cost < min_cost:
min_cost = cost
return min_cost
# Pattern 2: C > A > B'
def pattern2():
min_cost = INF
min_b = max(0, B - (A - 1))
max_b = B - 1
if min_b > max_b:
return INF
candidates = [min_b, max_b]
for delta in [-1, 0, 1]:
c_b = B - (C - 2) + delta
if c_b >= min_b and c_b <= max_b:
candidates.append(c_b)
candidates = list(set(candidates))
for b in candidates:
if b < min_b or b > max_b:
continue
B_prime = B - b
if B_prime < 1:
continue
A_prime = B_prime + 1
a = A - A_prime
if a < 0:
continue
required_C_prime = A_prime + 1
if required_C_prime < 1:
continue
c = C - required_C_prime
if c < 0 or (C - c) < 1:
continue
C_prime = required_C_prime
if C_prime > A_prime and A_prime > B_prime and (C_prime != A_prime) and (A_prime != B_prime) and (C_prime != B_prime):
cost = a * X + b * Y + c * Z
if cost < min_cost:
min_cost = cost
return min_cost
# Pattern 3: B > A > C'
def pattern3():
min_cost = INF
min_c = max(0, C - (A - 1))
max_c = C - 1
if min_c > max_c:
return INF
candidates = [min_c, max_c]
for delta in [-1, 0, 1]:
c_c = C - (B - 2) + delta
if c_c >= min_c and c_c <= max_c:
candidates.append(c_c)
candidates = list(set(candidates))
for c in candidates:
if c < min_c or c > max_c:
continue
C_prime = C - c
if C_prime < 1:
continue
A_prime = C_prime + 1
a = A - A_prime
if a < 0:
continue
required_B_prime = A_prime + 1
if required_B_prime < 1:
continue
b = B - required_B_prime
if b < 0 or (B - b) < 1:
continue
B_prime = required_B_prime
if B_prime > A_prime and A_prime > C_prime and (B_prime != A_prime) and (A_prime != C_prime) and (B_prime != C_prime):
cost = a * X + b * Y + c * Z
if cost < min_cost:
min_cost = cost
return min_cost
# Pattern 4: B > C > A'
def pattern4():
min_cost = INF
min_a = max(0, A - (C - 1))
max_a = A - 1
if min_a > max_a:
return INF
candidates = [min_a, max_a]
for delta in [-1, 0, 1]:
c_a = A - (B - 2) + delta
if c_a >= min_a and c_a <= max_a:
candidates.append(c_a)
candidates = list(set(candidates))
for a in candidates:
if a < min_a or a > max_a:
continue
A_prime = A - a
if A_prime < 1:
continue
C_prime = A_prime + 1
c = C - C_prime
if c < 0 or (C - c) < 1:
continue
required_B_prime = C_prime + 1
if required_B_prime < 1:
continue
b = B - required_B_prime
if b < 0 or (B - b) < 1:
continue
B_prime = required_B_prime
if B_prime > C_prime and C_prime > A_prime and (B_prime != C_prime) and (C_prime != A_prime) and (B_prime != A_prime):
cost = a * X + b * Y + c * Z
if cost < min_cost:
min_cost = cost
return min_cost
cost1 = pattern1()
cost2 = pattern2()
cost3 = pattern3()
cost4 = pattern4()
# Check other patterns like C > B > A and others if needed but according to Kadomatsu's second condition, only the four cases are possible
min_total = min(cost1, cost2, cost3, cost4)
return min_total if min_total != INF else -1
def main():
input = sys.stdin.read().split()
idx = 0
T = int(input[idx])
idx +=1
for _ in range(T):
A = int(input[idx])
B = int(input[idx+1])
C = int(input[idx+2])
X = int(input[idx+3])
Y = int(input[idx+4])
Z = int(input[idx+5])
idx +=6
res = compute_min_cost(A, B, C, X, Y, Z)
print(res if res != INF else -1)
if __name__ == "__main__":
main()
lam6er