結果
| 問題 | No.951 【本日限定】1枚頼むともう1枚無料! | 
| コンテスト | |
| ユーザー |  qwewe | 
| 提出日時 | 2025-05-14 12:55:36 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,240 bytes | 
| コンパイル時間 | 236 ms | 
| コンパイル使用メモリ | 82,392 KB | 
| 実行使用メモリ | 266,912 KB | 
| 最終ジャッジ日時 | 2025-05-14 12:57:35 | 
| 合計ジャッジ時間 | 61,761 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 36 TLE * 16 | 
ソースコード
def main():
    import sys
    input = sys.stdin.read().split()
    idx = 0
    N = int(input[idx])
    K = int(input[idx+1])
    idx +=2
    pizzas = []
    for _ in range(N):
        P = int(input[idx])
        D = int(input[idx+1])
        pizzas.append((-P, -D))  # Sort by descending P, then descending D
        idx +=2
    pizzas.sort()
    # Convert back to positive
    pizzas = [(-p, -d) for (p, d) in pizzas]
    
    # Initialize DP: dictionary of (cost, state) to max_deliciousness
    dp = [ [-1]*(2) for _ in range(K+1) ]
    dp[0][0] = 0  # initial state: cost 0, state 0
    
    for (p, d) in pizzas:
        # Create a new temporary DP
        new_dp = [ row[:] for row in dp ]  # copy current state
        for cost in range(K+1):
            for state in [0, 1]:
                current_d = dp[cost][state]
                if current_d == -1:
                    continue
                # Option 1: Pay for this pizza if state is 0
                if state == 0:
                    new_cost = cost + p
                    if new_cost <= K:
                        if new_dp[new_cost][1] < current_d + d:
                            new_dp[new_cost][1] = current_d + d
                # Option 2: If state is 1, take this pizza as free
                if state == 1:
                    # Take as free
                    if new_dp[cost][0] < current_d + d:
                        new_dp[cost][0] = current_d + d
                    # Pay for this pizza (without taking free)
                    new_cost_pay = cost + p
                    if new_cost_pay <= K:
                        if new_dp[new_cost_pay][1] < current_d + d:
                            new_dp[new_cost_pay][1] = current_d + d
                    # Do not pay and do not take free (state becomes 0)
                    if new_dp[cost][0] < current_d:
                        new_dp[cost][0] = current_d
        # Update dp to new_dp
        dp = new_dp
    
    # Find the maximum deliciousness across all possible costs and states
    max_del = 0
    for cost in range(K+1):
        for state in [0, 1]:
            if dp[cost][state] > max_del:
                max_del = dp[cost][state]
    print(max_del)
if __name__ == '__main__':
    main()
            
            
            
        