結果

問題 No.968 引き算をして門松列(その3)
ユーザー gew1fw
提出日時 2025-06-12 20:00:17
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 4,601 bytes
コンパイル時間 192 ms
コンパイル使用メモリ 82,244 KB
実行使用メモリ 66,036 KB
最終ジャッジ日時 2025-06-12 20:03:45
合計ジャッジ時間 3,745 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other TLE * 1 -- * 9
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0