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 }

 

posted @ 2019-05-08 19:58  YeLingqi  阅读(169)  评论(0编辑  收藏  举报