結果
| 問題 |
No.3076 Goodstuff Deck Builder
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-28 22:18:49 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,005 bytes |
| コンパイル時間 | 431 ms |
| コンパイル使用メモリ | 82,400 KB |
| 実行使用メモリ | 146,636 KB |
| 最終ジャッジ日時 | 2025-03-28 22:18:58 |
| 合計ジャッジ時間 | 8,898 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 6 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
#Trueのとき左に追加される
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=10
dp=[[-INF]*(l+1)for _ in range(m+1)]
dp[m][0]=0
for i in range(1,n+1):
c,d=ne[i-1]
ndp=[[-INF]*(l+1)for _ in range(m+1)]
for j in range(m+1): #残りエネルギー
for k in range(l+1): #何個使ったか
ndp[j][k]=max(ndp[j][k],dp[j][k])
nj=j-c*(2**k)
if nj>=0:
ndp[nj][k+1]=max(ndp[nj][k+1],dp[j][k]+d)
dp=[t[:]for t in ndp]
ans=sd
for j in range(m+1):
for k in range(l+1):
ans=max(ans,sd+dp[j][k])
print(ans)