結果
問題 |
No.951 【本日限定】1枚頼むともう1枚無料!
|
ユーザー |
![]() |
提出日時 | 2025-04-09 21:03:00 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,569 bytes |
コンパイル時間 | 342 ms |
コンパイル使用メモリ | 82,108 KB |
実行使用メモリ | 406,100 KB |
最終ジャッジ日時 | 2025-04-09 21:05:52 |
合計ジャッジ時間 | 6,959 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 9 TLE * 1 -- * 42 |
ソースコード
import sys def main(): N, K = map(int, sys.stdin.readline().split()) pizzas = [tuple(map(int, sys.stdin.readline().split())) for _ in range(N)] # Sort by price descending, then by deliciousness descending pizzas.sort(key=lambda x: (-x[0], -x[1])) # Initialize DP dp_prev = [[-1] * (N+2) for _ in range(K+1)] # K+1 x (N+1) dp_prev[0][0] = 0 # cost 0, 0 free, total deliciousness 0 for i in range(N): P, D = pizzas[i] dp_next = [row[:] for row in dp_prev] for k in range(K+1): for r in range(N+1): if dp_prev[k][r] == -1: continue # Option 1: Buy the pizza if k + P <= K: new_k = k + P new_r = r + 1 if new_r > N: continue if dp_next[new_k][new_r] < dp_prev[k][r] + D: dp_next[new_k][new_r] = dp_prev[k][r] + D # Option 2: Take free if possible (r > 0) if r > 0: new_k = k new_r = r - 1 if dp_next[new_k][new_r] < dp_prev[k][r] + D: dp_next[new_k][new_r] = dp_prev[k][r] + D dp_prev = dp_next # Find the maximum deliciousness across all possible k and r max_del = 0 for k in range(K+1): for r in range(N+1): if dp_prev[k][r] > max_del: max_del = dp_prev[k][r] print(max_del) if __name__ == "__main__": main()