結果

問題 No.3068 Speedrun (Hard)
コンテスト
ユーザー V_Melville
提出日時 2025-03-21 23:08:52
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
TLE  
実行時間 -
コード長 2,388 bytes
コンパイル時間 304 ms
コンパイル使用メモリ 12,416 KB
実行使用メモリ 17,944 KB
最終ジャッジ日時 2025-03-21 23:08:57
合計ジャッジ時間 4,191 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 TLE * 1
other -- * 32
権限があれば一括ダウンロードができます

ソースコード

diff #

A, B, C, D, N = map(int, input().split())
P, Q, R, S, T = map(int, input().split())

# aの最小値は、a + b >= N - (C + D) かつ b <= B → a >= N - (C + D) - B
a_min = max(0, N - (C + D) - B)
a_max = min(A, N)
# aを大きい順に試す
for a in range(a_max, a_min - 1, -1):
    # 残り時間が不足している場合はスキップ
    remaining_time_after_a = T - a * P
    if remaining_time_after_a < 0:
        continue
    
    # bの範囲を計算
    # rem = c + d <= C + D → rem >= N -a - B
    b_low = max(0, N - a - (C + D))
    b_high = min(B, N - a)
    if b_low > b_high:
        continue
    
    # 時間制約からbの上限を再計算
    if Q > 0:
        max_b_by_time = remaining_time_after_a // Q
        b_high = min(b_high, max_b_by_time)
    else:
        # Qが0の場合はbが何でも良いが、問題文でQ>0と仮定
        pass
    
    if b_low > b_high:
        continue
    
    # bを大きい順に試す
    for b in range(b_high, b_low - 1, -1):
        rem = N - a - b
        if rem < 0 or rem > C + D:
            continue
        
        time_rem = remaining_time_after_a - b * Q
        if time_rem < 0:
            continue
        
        # RとSが異なる場合
        if R != S:
            denominator = R - S
            numerator = time_rem - S * rem
            if denominator == 0:
                continue  # このケースはR=Sでないので発生しない
            if numerator % denominator != 0:
                continue
            c = numerator // denominator
            d = rem - c
            if 0 <= c <= C and 0 <= d <= D:
                print(a, b, c, d)
                exit()
        else:
            # R == Sの場合、time_rem == R * rem かつ c + d = rem
            if time_rem != R * rem:
                continue
            # cの範囲をチェック
            c_min = max(0, rem - D)
            c_max = min(C, rem)
            if c_min > c_max:
                continue
            # 最大値から試す
            c = c_max
            d = rem - c
            if d >= 0 and d <= D:
                print(a, b, c, d)
                exit()
            else:
                # 最小値を試す
                c = c_min
                d = rem - c
                if c >= 0 and c <= C and d >= 0 and d <= D:
                    print(a, b, c, d)
                    exit()
0