結果
| 問題 |
No.158 奇妙なお使い
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 18:51:37 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 7,986 bytes |
| コンパイル時間 | 162 ms |
| コンパイル使用メモリ | 82,580 KB |
| 実行使用メモリ | 78,068 KB |
| 最終ジャッジ日時 | 2025-06-12 18:51:50 |
| 合計ジャッジ時間 | 2,578 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 22 WA * 5 |
ソースコード
def can_pay(a1000, a100, a1, D):
for use_1000 in range(min(a1000, D // 1000), -1, -1):
rem = D - use_1000 * 1000
if rem < 0:
continue
for use_100 in range(min(a100, rem // 100), -1, -1):
rem2 = rem - use_100 * 100
if rem2 <= a1:
return True
return False
def find_payment(a1000, a100, a1, D):
for use_1000 in range(min(a1000, D // 1000), -1, -1):
rem = D - use_1000 * 1000
if rem < 0:
continue
for use_100 in range(min(a100, rem // 100), -1, -1):
rem2 = rem - use_100 * 100
if rem2 <= a1:
return (use_1000, use_100, rem2)
return None
def simulate_B_then_C(a1000, a100, a1, Db, Bb, Dc, Cc):
current = [a1000, a100, a1]
count = 0
# B phase
while True:
if can_pay(current[0], current[1], current[2], Db):
use = find_payment(current[0], current[1], current[2], Db)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Bb[0]
current[1] += Bb[1]
current[2] += Bb[2]
count += 1
else:
break
# C phase
while True:
if can_pay(current[0], current[1], current[2], Dc):
use = find_payment(current[0], current[1], current[2], Dc)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Cc[0]
current[1] += Cc[1]
current[2] += Cc[2]
count += 1
else:
break
return count
def simulate_C_then_B(a1000, a100, a1, Db, Bb, Dc, Cc):
current = [a1000, a100, a1]
count = 0
# C phase
while True:
if can_pay(current[0], current[1], current[2], Dc):
use = find_payment(current[0], current[1], current[2], Dc)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Cc[0]
current[1] += Cc[1]
current[2] += Cc[2]
count += 1
else:
break
# B phase
while True:
if can_pay(current[0], current[1], current[2], Db):
use = find_payment(current[0], current[1], current[2], Db)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Bb[0]
current[1] += Bb[1]
current[2] += Bb[2]
count += 1
else:
break
return count
def simulate_alternate_BC(a1000, a100, a1, Db, Bb, Dc, Cc):
current = [a1000, a100, a1]
count = 0
turn = 0 # 0 for B, 1 for C
while True:
made_move = False
if turn % 2 == 0:
# Try B
if can_pay(current[0], current[1], current[2], Db):
use = find_payment(current[0], current[1], current[2], Db)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Bb[0]
current[1] += Bb[1]
current[2] += Bb[2]
count += 1
made_move = True
turn += 1
else:
# Try C instead
if can_pay(current[0], current[1], current[2], Dc):
use = find_payment(current[0], current[1], current[2], Dc)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Cc[0]
current[1] += Cc[1]
current[2] += Cc[2]
count += 1
made_move = True
turn += 1
else:
# Try C
if can_pay(current[0], current[1], current[2], Dc):
use = find_payment(current[0], current[1], current[2], Dc)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Cc[0]
current[1] += Cc[1]
current[2] += Cc[2]
count += 1
made_move = True
turn += 1
else:
# Try B instead
if can_pay(current[0], current[1], current[2], Db):
use = find_payment(current[0], current[1], current[2], Db)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Bb[0]
current[1] += Bb[1]
current[2] += Bb[2]
count += 1
made_move = True
turn += 1
if not made_move:
break
return count
def simulate_alternate_CB(a1000, a100, a1, Db, Bb, Dc, Cc):
current = [a1000, a100, a1]
count = 0
turn = 0 # 0 for C, 1 for B
while True:
made_move = False
if turn % 2 == 0:
# Try C
if can_pay(current[0], current[1], current[2], Dc):
use = find_payment(current[0], current[1], current[2], Dc)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Cc[0]
current[1] += Cc[1]
current[2] += Cc[2]
count += 1
made_move = True
turn += 1
else:
# Try B instead
if can_pay(current[0], current[1], current[2], Db):
use = find_payment(current[0], current[1], current[2], Db)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Bb[0]
current[1] += Bb[1]
current[2] += Bb[2]
count += 1
made_move = True
turn += 1
else:
# Try B
if can_pay(current[0], current[1], current[2], Db):
use = find_payment(current[0], current[1], current[2], Db)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Bb[0]
current[1] += Bb[1]
current[2] += Bb[2]
count += 1
made_move = True
turn += 1
else:
# Try C instead
if can_pay(current[0], current[1], current[2], Dc):
use = find_payment(current[0], current[1], current[2], Dc)
current[0] -= use[0]
current[1] -= use[1]
current[2] -= use[2]
current[0] += Cc[0]
current[1] += Cc[1]
current[2] += Cc[2]
count += 1
made_move = True
turn += 1
if not made_move:
break
return count
def main():
a1000, a100, a1 = map(int, input().split())
Db = int(input())
Bb = list(map(int, input().split()))
Dc = int(input())
Cc = list(map(int, input().split()))
max_count = 0
# Pattern 1: B then C
count1 = simulate_B_then_C(a1000, a100, a1, Db, Bb, Dc, Cc)
max_count = max(max_count, count1)
# Pattern 2: C then B
count2 = simulate_C_then_B(a1000, a100, a1, Db, Bb, Dc, Cc)
max_count = max(max_count, count2)
# Pattern 3: Alternate BC
count3 = simulate_alternate_BC(a1000, a100, a1, Db, Bb, Dc, Cc)
max_count = max(max_count, count3)
# Pattern 4: Alternate CB
count4 = simulate_alternate_CB(a1000, a100, a1, Db, Bb, Dc, Cc)
max_count = max(max_count, count4)
print(max_count)
if __name__ == "__main__":
main()
gew1fw