結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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