結果
| 問題 |
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 |
ソースコード
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()
gew1fw