結果
| 問題 |
No.3014 岩井満足性問題
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-02-04 10:37:30 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 502 ms / 3,000 ms |
| コード長 | 1,489 bytes |
| コンパイル時間 | 728 ms |
| コンパイル使用メモリ | 82,348 KB |
| 実行使用メモリ | 78,080 KB |
| 最終ジャッジ日時 | 2025-02-04 10:37:39 |
| 合計ジャッジ時間 | 5,718 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 18 |
ソースコード
def main():
import sys
# 入力は sys.stdin.buffer.read() で一括読み込み(高速)
data = sys.stdin.buffer.read().split()
if not data:
return
it = iter(data)
try:
N = int(next(it))
D = int(next(it))
K = int(next(it))
except StopIteration:
return
A = [0] * N
for i in range(N):
A[i] = int(next(it))
C = [0] * N
for i in range(N):
C[i] = int(next(it))
INF = -10 ** 18 # 達成不可能な値(満足度の下限より十分小さい)
# dp[d][b] = 採用済み問題が d 個,合計美しさが b (b>=K は b=K とする) のときの最大満足度
dp = [[INF] * (K + 1) for _ in range(D + 1)]
dp[0][0] = 0
# 各問題について更新(0/1ナップザック方式)
for i in range(N):
a = A[i]
c = C[i]
# 採用済み問題数 d を D-1 から 0 まで逆順に更新
for d in range(D - 1, -1, -1):
cur = dp[d]
nxt = dp[d + 1]
for b in range(K + 1):
val = cur[b]
if val == INF:
continue
nb = b + c
if nb >= K:
nb = K
cand = val + a
if cand > nxt[nb]:
nxt[nb] = cand
ans = dp[D][K]
if ans == INF:
sys.stdout.write("No")
else:
sys.stdout.write(str(ans))
if __name__ == '__main__':
main()