非二分写法
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const int N = 2E5+5;
int a[N],b[N],c[N];
int f[N],g[N];
bool cmp(int a,int b){
return a > b;
}
signed main() {
cin >> n >> m;
for(int i = 1;i <= n;i++){
int t,x;
cin >> t >> x;
if(t==0) a[++a[0]] = x;
else if(t==1) b[++b[0]] = x;
else c[++c[0]] = x;
}
sort(a+1,a+1+a[0],cmp);
sort(b+1,b+1+b[0],cmp);
sort(c+1,c+1+c[0],cmp);
for(int i = 1;i <= a[0];i++){
f[i] = f[i-1] + a[i];
}
int res=0,ci=0;
int cnt=0;
for(int i = 1;i <= b[0];i++){
while(res < i && ci <= c[0]) res += c[++ci];
if(res<i) break;
cnt+=b[i];
g[ci+i]=cnt;
}
int ans=0;
for(int i = 0;i <= m;i++){
ans=max(ans,g[i]+f[m-i]);
}cout<<ans;
return 0;
}
提交记录
请大佬帮忙调一下,或者给出heck