比赛 2026.9.5 评测结果 AAEEEAEWWWWAWEWEEWAAAAAAW
题目名称 Asteroid Mining 最终得分 40
用户昵称 Ruyi 运行时间 3.133 s
代码语言 C++ 内存使用 11.04 MiB
提交时间 2026-09-05 10:52:43
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define N 500001
using namespace std;
ll n,m,v[N],w[N],dp[N],ans,a[N],b[N],oth,cnt,cnt2,s1[N],s2[N];
bool flag=true;
ll read(){
	ll x=0,f=1;
	char c=' ';
	while(c>'9'||c<'0'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+(c-'0');
		c=getchar();
	}
	return x*f;
}
void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar(x%10+'0');
	return ; 
}
int main(){
    freopen("Mining.in","r",stdin);
    freopen("Mining.out","w",stdout);
    n=read();
    m=read();
    for(int i=1;i<=n;i++){
        v[i]=read();
        w[i]=read();
        if(i!=1&&w[i]!=w[i-1]) flag=false;
    }
    if(n*m<=1e8){
        for(int i=1;i<=n;i++)
        for(int j=m;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        write(dp[m]);
    }else if(flag){
        sort(v+1,v+n+1,greater<ll>());
        for(int i=1;i<=min(n,m/w[1]);i++) ans+=v[i];
        write(ans);
    }else{
        for(int i=1;i<=n;i++){
            if(w[i]==w[1]) a[++cnt]=v[i];
            else{
                oth=w[i];
                b[++cnt2]=v[i];
            }
        }
        sort(a+1,a+cnt+1,greater<ll>());
        sort(b+1,b+cnt2+1,greater<ll>());
        for(int i=1;i<=cnt;i++) s1[i]=s1[i-1]+a[i];
        for(int i=1;i<=cnt2;i++) s2[i]=s2[i-1]+b[i];
        for(int i=cnt+1;i<=n;i++) s1[i]=s1[i-1];
        for(int i=cnt2+1;i<=n;i++) s2[i]=s2[i-1];
        for(int i=0;i<=cnt;i++) ans=max(ans,s1[i]+s2[(m-i*w[1])/oth]);
        write(ans);
    }
    return 0;
}