Codeforces 808E
点这里!
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N=1e5+5,M=3e5+5; 5 int n,m,num[4],a[4][N]; 6 ll ans,sum3[N]; 7 struct node {ll v; int s1,s2;}f[M]; 8 inline int read() { 9 int x=0; char c=getchar(); 10 while(c<'0'||c>'9') c=getchar(); 11 while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar(); 12 return x; 13 } 14 bool cmp(int x,int y) {return x>y;} 15 16 int main() { 17 n=read(),m=read(); 18 for(int i=1;i<=n;i++) { 19 int w=read(),c=read(); 20 a[w][++num[w]]=c; 21 } 22 for(int i=1;i<=3;i++) 23 sort(a[i]+1,a[i]+num[i]+1,cmp); 24 for(int i=1;i<=num[3];i++) 25 sum3[i]=sum3[i-1]+a[3][i]; 26 27 for(int i=1;i<=m;i++) { 28 f[i]=f[i-1]; 29 //1 30 if(f[i-1].v+a[1][f[i-1].s1+1]>f[i].v) { 31 f[i].v=f[i-1].v+a[1][f[i-1].s1+1]; 32 f[i].s1=f[i-1].s1+1; 33 f[i].s2=f[i-1].s2; 34 } 35 //2 36 if(i>=2&&f[i-2].v+a[2][f[i-2].s2+1]>f[i].v) { 37 f[i].v=f[i-2].v+a[2][f[i-2].s2+1]; 38 f[i].s1=f[i-2].s1; 39 f[i].s2=f[i-2].s2+1; 40 } 41 } 42 for(int i=0;i<=num[3]&&3*i<=m;i++) 43 if(sum3[i]+f[m-3*i].v>ans) ans=sum3[i]+f[m-3*i].v; 44 printf("%lld",ans); 45 }
如有错误请指正。