結果
問題 |
No.968 引き算をして門松列(その3)
|
ユーザー |
![]() |
提出日時 | 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()