結果
問題 | No.1872 Dictionary Order |
ユーザー |
👑 ![]() |
提出日時 | 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 sysfrom sys import stdinN,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] -= 1dp = [ [False] * (M+1) for i in range(N+1) ]dp[N][0] = Truefor i in range(N,0,-1):for j in range(M+1):# i-1 番目を取らない場合if dp[i][j] == False:continueif 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:continuetup = (P[i-1],A[i-1],i)if dp[i-1][nexj] == False or dp[i][j] == True:dp[i-1][nexj] = tupelse:dp[i-1][nexj] = min(dp[i-1][nexj] , tup)ntup = dp[0][M]if ntup == False:print (-1)sys.exit()ANS = ans = []NM = Mwhile NM > 0:ans.append( ntup[2] )NV = ntup[2]NM -= ntup[1]ntup = dp[NV][NM]print (len(ans))print (" ".join(map(str,ANS)))