結果
| 問題 |
No.1872 Dictionary Order
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2022-03-11 23:03:38 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 753 ms / 2,000 ms |
| コード長 | 1,303 bytes |
| コンパイル時間 | 330 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 313,472 KB |
| 最終ジャッジ日時 | 2024-09-19 08:44:06 |
| 合計ジャッジ時間 | 8,889 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
"""
本当に酷い
ちゃんと推移を考えないからです
dp[v][S]
= v以降から和がSの集合を取る事が達成できる場合
最初に取ることができる要素の (P_i,A_i,i)
"""
import sys
from sys import stdin
N,M = map(int,stdin.readline().split())
a = A = list(map(int,stdin.readline().split()))
P = list(map(int,stdin.readline().split()))
for i in range(N):
P[i] -= 1
dp = [ [False] * (M+1) for i in range(N+1) ]
dp[N][0] = True
for i in range(N,0,-1):
for j in range(M+1):
# i-1 番目を取らない場合
if dp[i][j] == False:
continue
if dp[i-1][j] == False or dp[i][j] == True:
dp[i-1][j] = dp[i][j]
else:
dp[i-1][j] = min(dp[i-1][j] , dp[i][j])
#取る場合
nexj = j + a[i-1]
if nexj > M:
continue
tup = (P[i-1],A[i-1],i)
if dp[i-1][nexj] == False or dp[i][j] == True:
dp[i-1][nexj] = tup
else:
dp[i-1][nexj] = min(dp[i-1][nexj] , tup)
ntup = dp[0][M]
if ntup == False:
print (-1)
sys.exit()
ANS = ans = []
NM = M
while NM > 0:
ans.append( ntup[2] )
NV = ntup[2]
NM -= ntup[1]
ntup = dp[NV][NM]
print (len(ans))
print (" ".join(map(str,ANS)))
SPD_9X2