結果
| 問題 |
No.281 門松と魔法(1)
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:59:59 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,296 bytes |
| コンパイル時間 | 393 ms |
| コンパイル使用メモリ | 82,848 KB |
| 実行使用メモリ | 67,228 KB |
| 最終ジャッジ日時 | 2025-03-31 18:00:57 |
| 合計ジャッジ時間 | 3,814 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 WA * 5 TLE * 1 -- * 41 |
ソースコード
def main():
import sys
d = int(sys.stdin.readline())
H = [int(sys.stdin.readline()) for _ in range(3)]
h1, h2, h3 = H
def is_valid(a, b, c):
if a == b or b == c or a == c:
return False
return (b > a and b > c) or (b < a and b < c)
if is_valid(h1, h2, h3):
print(0)
return
if d == 0:
print(-1)
return
min_total = float('inf')
def calculate_modeA():
nonlocal min_total
min_modeA = float('inf')
for k2 in range(0, 200):
current_h2 = h2 - k2 * d
if current_h2 < 0:
break
k1_min = max(0, (h1 - (current_h2 - 1) + d - 1) // d)
h1_candidate = h1 - k1_min * d
if h1_candidate < 0:
req_k1 = h1 // d
if h1 - req_k1 * d > current_h2 - 1:
continue
k1_min = req_k1
h1_candidate = h1 - k1_min * d
if h1_candidate < 0:
continue
if h1_candidate >= current_h2:
continue
k3_min = max(0, (h3 - (current_h2 - 1) + d - 1) // d)
h3_candidate = h3 - k3_min * d
if h3_candidate < 0:
req_k3 = h3 // d
if h3 - req_k3 * d > current_h2 - 1:
continue
k3_min = req_k3
h3_candidate = h3 - k3_min * d
if h3_candidate < 0:
continue
if h3_candidate >= current_h2:
continue
total = k2 + k1_min + k3_min
if h1_candidate != h3_candidate:
if total < min_modeA:
min_modeA = total
else:
if h1_candidate == h3_candidate:
opt1 = (k1_min + 1, k3_min)
h1_opt = h1 - opt1[0] * d
if h1_opt >= 0 and h1_opt < current_h2:
total_opt1 = k2 + opt1[0] + opt1[1]
if total_opt1 < min_modeA:
min_modeA = total_opt1
opt2 = (k1_min, k3_min + 1)
h3_opt = h3 - opt2[1] * d
if h3_opt >= 0 and h3_opt < current_h2:
total_opt2 = k2 + opt2[0] + opt2[1]
if total_opt2 < min_modeA:
min_modeA = total_opt2
return min_modeA
def calculate_modeB():
nonlocal min_total
min_modeB = float('inf')
for k2 in range(0, 200):
current_h2 = h2 - k2 * d
if current_h2 < 0:
break
rem = h1 - current_h2 - 1
k1_min = 0
if rem > 0:
k1_min = 0
else:
needed = (-rem + d - 1) // d
k1_min = needed
h1_candidate = h1 - k1_min * d
if h1_candidate <= current_h2 or h1_candidate < 0:
k1_max = h1 // d
possible = False
for k1 in range(0, k1_max + 1):
temp_h1 = h1 - k1 * d
if temp_h1 > current_h2 and temp_h1 >= 0:
possible = True
k1_min = k1
h1_candidate = temp_h1
break
if not possible:
continue
rem3 = h3 - current_h2 - 1
k3_min = 0
if rem3 > 0:
k3_min = 0
else:
needed = (-rem3 + d - 1) // d
k3_min = needed
h3_candidate = h3 - k3_min * d
if h3_candidate <= current_h2 or h3_candidate < 0:
k3_max = h3 // d
possible = False
for k3 in range(0, k3_max + 1):
temp_h3 = h3 - k3 * d
if temp_h3 > current_h2 and temp_h3 >= 0:
possible = True
k3_min = k3
h3_candidate = temp_h3
break
if not possible:
continue
total = k2 + k1_min + k3_min
if h1_candidate != h3_candidate:
if total < min_modeB:
min_modeB = total
else:
if h1_candidate == h3_candidate:
opt1 = (k1_min + 1, k3_min)
h1_opt = h1 - opt1[0] * d
if h1_opt > current_h2 and h1_opt >= 0:
total_opt1 = k2 + opt1[0] + opt1[1]
if total_opt1 < min_modeB:
min_modeB = total_opt1
opt2 = (k1_min, k3_min + 1)
h3_opt = h3 - opt2[1] * d
if h3_opt > current_h2 and h3_opt >= 0:
total_opt2 = k2 + opt2[0] + opt2[1]
if total_opt2 < min_modeB:
min_modeB = total_opt2
return min_modeB
modeA_min = calculate_modeA()
modeB_min = calculate_modeB()
min_total = min(modeA_min, modeB_min)
if min_total != float('inf'):
print(min_total)
else:
print(-1)
if __name__ == '__main__':
main()
lam6er