結果
| 問題 |
No.968 引き算をして門松列(その3)
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 15:11:09 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,601 bytes |
| コンパイル時間 | 406 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 63,872 KB |
| 最終ジャッジ日時 | 2025-06-12 15:11:23 |
| 合計ジャッジ時間 | 3,740 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | TLE * 1 -- * 9 |
ソースコード
import sys
def compute_min_cost(A, B, C, X, Y, Z):
min_total = float('inf')
# 尝试所有可能的门松列结构
# 结构一:B' > A' > C'
# 其中,a=0
for c in range(0, A):
a_plus_c = c
A_prime = A - a_plus_c
if A_prime < 1:
continue
# B' = B - b
# A' > C' --> A - c > C - (b + c) --> A > C - b
# 即 b > C - A
min_b = max(C - A + 1, 0)
max_b = min(B - 1, C - 1 - c)
if min_b > max_b:
continue
# B' > A'
# B - b > A - c --> B - A > b - c --> b < B - A + c
max_b_for_b = min(max_b, B - A + c - 1)
if max_b_for_b < min_b:
continue
# 寻找最小的b
b = min_b
if b > max_b_for_b:
continue
B_prime = B - b
C_prime = C - b - c
if C_prime < 1:
continue
if B_prime > A_prime and A_prime > C_prime:
# 计算操作次数
# 操作1: a=0
# 操作2: b次,每次减B和C,成本Y
total = Y * b
# 操作3: c次,每次减A和C,成本Z
total += Z * c
if total < min_total:
min_total = total
# 结构二:C' > A' > B'
for c in range(0, A):
a_plus_c = c
A_prime = A - a_plus_c
if A_prime < 1:
continue
# B' = B - b
# C' = C - (b + c)
# 条件:C' > A' > B'
# 即 C - b - c > A - c --> C - b > A --> b < C - A
# 同时,A' > B' --> A - c > B - b --> B - b < A - c --> b > B - (A - c)
# B' >=1 --> b <= B -1
max_b = min(C - A - 1, B - 1)
min_b = max(B - (A - c) + 1, 0)
if min_b > max_b:
continue
# 寻找最小的b
b = min_b
if b > max_b:
continue
C_prime = C - b - c
if C_prime < 1:
continue
B_prime = B - b
if A_prime < B_prime:
continue
if C_prime > A_prime and A_prime > B_prime:
# 计算操作次数
total = Y * b + Z * c
if total < min_total:
min_total = total
# 结构三:B' > C' > A'
for c in range(0, C):
a_plus_c = c
C_prime = C - a_plus_c
if C_prime < 1:
continue
# A' = A - (0 + c) = A - c
A_prime = A - c
if A_prime < 1:
continue
# B' = B - b
# 条件:B' > C' > A'
# 即 B - b > C - c --> B - C > b - c --> b < B - C + c
# 同时,C' > A' --> C - c > A - c --> C > A --> 不满足时无需处理
if C <= A:
continue
max_b = min(B - C + c - 1, B - 1)
if max_b < 0:
continue
min_b = 0
if min_b > max_b:
continue
# 寻找最小的b
b = min_b
B_prime = B - b
if B_prime <= C_prime:
continue
if C_prime <= A_prime:
continue
# 计算操作次数
total = Y * b + Z * c
if total < min_total:
min_total = total
# 结构四:A' > C' > B'
for c in range(0, C):
a_plus_c = c
C_prime = C - a_plus_c
if C_prime < 1:
continue
# A' = A - c
A_prime = A - c
if A_prime < 1:
continue
# B' = B - b
# 条件:A' > C' > B'
# 即 A' > C' --> A - c > C - c --> A > C --> 不满足时无需处理
if A <= C:
continue
# 同时,C' > B' --> C - c > B - b --> b > B - (C - c)
min_b = max(B - (C - c) + 1, 0)
max_b = min(B - 1, C - 1 - c)
if min_b > max_b:
continue
# 寻找最小的b
b = min_b
if b > max_b:
continue
B_prime = B - b
if C_prime <= B_prime:
continue
if A_prime <= C_prime:
continue
# 计算操作次数
total = Y * b + Z * c
if total < min_total:
min_total = total
if min_total == float('inf'):
return -1
else:
return min_total
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 __name__ == "__main__":
main()
gew1fw