結果

問題 No.3076 Goodstuff Deck Builder
ユーザー moon17
提出日時 2025-03-28 22:34:14
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 2,450 ms / 3,000 ms
コード長 989 bytes
コンパイル時間 227 ms
コンパイル使用メモリ 82,600 KB
実行使用メモリ 80,180 KB
最終ジャッジ日時 2025-03-28 22:34:43
合計ジャッジ時間 24,874 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 36
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

(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)
tw=[1]
for _ in range(l+10):
tw+=tw[-1]*2,
dp=[[-INF]*(l+1)for _ in range(m+1)]
dp[m][0]=0
ans=0
for i in range(1,n+1):
c,d=ne[i-1]
for k in range(l+1)[::-1]: #使
if c*tw[k]>m:
continue
for j in range(m+1): #
dp[j][k]=max(dp[j][k],dp[j][k])
ans=max(ans,dp[j][k])
nj=j-c*tw[k]
if nj>=0 and k+1<=l:
dp[nj][k+1]=max(dp[nj][k+1],dp[j][k]+d)
ans=max(ans,dp[nj][k+1])
print(ans+sd)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0