結果
問題 |
No.3076 Goodstuff Deck Builder
|
ユーザー |
|
提出日時 | 2025-03-28 22:28:17 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,070 bytes |
コンパイル時間 | 145 ms |
コンパイル使用メモリ | 82,656 KB |
実行使用メモリ | 79,588 KB |
最終ジャッジ日時 | 2025-03-28 22:28:34 |
合計ジャッジ時間 | 5,983 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 5 RE * 1 TLE * 1 -- * 29 |
ソースコード
(n,m),*e=[[*map(int,s.split())]for s in open(0)] def compare(l,r): c1,d1=l c2,d2=r return c1+2*c2<=c2+2*c1 def merge(L,R): ret=[] l=r=0 while l<len(L) and r<len(R): if compare(L[l],R[r]): ret+=L[l], l+=1 else: ret+=R[r], r+=1 return ret+L[l:]+R[r:] def MergeSort(L): n=len(L)//2 if n: return merge(MergeSort(L[:n]),MergeSort(L[n:])) return L ne=[] sd=0 for c,d in e: if c==0: sd+=d else: ne+=(c,d), ne=MergeSort(ne) n=len(ne) INF=1<<60 l=min(n,9) dp=[[-INF]*(l+1)for _ in range(m+1)] dp[m][0]=0 tw=[1] for _ in range(l): tw+=tw[-1]*2, for i in range(1,n+1): c,d=ne[i-1] ndp=[[-INF]*(i+1)for _ in range(m+1)] for k in range(i+1): #何個使ったか if c*tw[k]>m: break for j in range(m+1): #残りエネルギー if k<i: ndp[j][k]=max(ndp[j][k],dp[j][k]) nj=j-c*tw[k] if nj>=0 and k+1<=i: ndp[nj][k+1]=max(ndp[nj][k+1],dp[j][k]+d) dp=[t[:]for t in ndp] ans=0 for j in range(m+1): for k in range(l+1): ans=max(ans,dp[j][k]) print(ans+sd)