結果

問題 No.158 奇妙なお使い
ユーザー gew1fw
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0