結果

問題 No.3076 Goodstuff Deck Builder
ユーザー moon17
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

(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)
0