結果
問題 |
No.281 門松と魔法(1)
|
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
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()