結果

問題 No.281 門松と魔法(1)
ユーザー gew1fw
提出日時 2025-06-12 18:48:53
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 3,406 bytes
コンパイル時間 252 ms
コンパイル使用メモリ 82,104 KB
実行使用メモリ 84,004 KB
最終ジャッジ日時 2025-06-12 18:49:18
合計ジャッジ時間 7,254 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 12 WA * 5 TLE * 3 -- * 37
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

def compute_case1(k2, d, H1, H2, H3):
    H2_prime = H2 - k2 * d
    if H2_prime < 0:
        return float('inf')
    
    # 计算k1的最小值,使得 H1' < H2_prime
    if H1 <= H2_prime:
        k1 = 0
        H1_prime = H1
    else:
        required = H1 - H2_prime + 1
        k1 = (required + d - 1) // d
        H1_prime = H1 - k1 * d
        if H1_prime < 0:
            return float('inf')
    
    # 计算k3的最小值,使得 H3' < H2_prime
    if H3 <= H2_prime:
        k3 = 0
        H3_prime = H3
    else:
        required = H3 - H2_prime + 1
        k3 = (required + d - 1) // d
        H3_prime = H3 - k3 * d
        if H3_prime < 0:
            return float('inf')
    
    if H1_prime == H3_prime:
        # 选项1:增加k1
        new_k1 = k1 + 1
        new_H1 = H1 - new_k1 * d
        if new_H1 < 0:
            option1 = float('inf')
        else:
            option1 = k2 + new_k1 + k3
        
        # 选项2:增加k3
        new_k3 = k3 + 1
        new_H3 = H3 - new_k3 * d
        if new_H3 < 0:
            option2 = float('inf')
        else:
            option2 = k2 + k1 + new_k3
        
        return min(option1, option2)
    else:
        return k1 + k2 + k3

def compute_case2(k2, d, H1, H2, H3):
    H2_prime = H2 - k2 * d
    if H2_prime < 0:
        return float('inf')
    
    # 检查H1是否 > H2_prime
    if H1 <= H2_prime:
        return float('inf')
    else:
        k1 = 0
        H1_prime = H1
    
    # 检查H3是否 > H2_prime
    if H3 <= H2_prime:
        return float('inf')
    else:
        k3 = 0
        H3_prime = H3
    
    if H1_prime == H3_prime:
        # 选项1:增加k1
        new_k1 = k1 + 1
        new_H1 = H1 - new_k1 * d
        if new_H1 < 0:
            option1 = float('inf')
        else:
            option1 = k2 + new_k1 + k3
        
        # 选项2:增加k3
        new_k3 = k3 + 1
        new_H3 = H3 - new_k3 * d
        if new_H3 < 0:
            option2 = float('inf')
        else:
            option2 = k2 + k1 + new_k3
        
        return min(option1, option2)
    else:
        return k1 + k2 + k3

def main():
    input = sys.stdin.read().split()
    idx = 0
    d = int(input[idx]); idx +=1
    H1 = int(input[idx]); idx +=1
    H2 = int(input[idx]); idx +=1
    H3 = int(input[idx]); idx +=1
    
    if d == 0:
        # 检查原始高度是否满足条件
        A = [H1, H2, H3]
        if len(set(A)) !=3:
            print(-1)
            return
        
        # 情况一:中间最高
        sorted_A = sorted(A)
        if (A[1] == sorted_A[2] and A[0] != A[2]) or (A[1] == sorted_A[0] and A[0] != A[2]):
            print(0)
            return
        
        print(-1)
        return
    
    min_case1 = float('inf')
    # 尝试k2的可能值,从0开始,直到H2_prime >=0
    max_k2_case1 = H2 // d + 1  # 避免遗漏
    for k2 in range(0, max_k2_case1 +1):
        res = compute_case1(k2, d, H1, H2, H3)
        if res < min_case1:
            min_case1 = res
    
    min_case2 = float('inf')
    max_k2_case2 = H2 // d +1
    for k2 in range(0, max_k2_case2 +1):
        res = compute_case2(k2, d, H1, H2, H3)
        if res < min_case2:
            min_case2 = res
    
    final_min = min(min_case1, min_case2)
    
    if final_min == float('inf'):
        print(-1)
    else:
        print(final_min)

if __name__ == "__main__":
    main()
0