結果
問題 |
No.158 奇妙なお使い
|
ユーザー |
![]() |
提出日時 | 2025-06-12 13:51:36 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 7,986 bytes |
コンパイル時間 | 188 ms |
コンパイル使用メモリ | 82,100 KB |
実行使用メモリ | 78,376 KB |
最終ジャッジ日時 | 2025-06-12 13:52:35 |
合計ジャッジ時間 | 2,930 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
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()