比赛 2026.9.5 评测结果 AAAAAAWWWWWAWWWWWWAAAAAAW
题目名称 Asteroid Mining 最终得分 52
用户昵称 ChenBp 运行时间 2.129 s
代码语言 C++ 内存使用 15.12 MiB
提交时间 2026-09-05 12:43:14
显示代码纯文本
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
using ll=long long;
const int N=5e5+5,M=1e4+4;
ll v[N],w[N];
ll f[N];
ll a[N],b[N];
struct node{
    ll v,w;
    node(){
        v=w=0;
    }
    node(ll _v,ll _w){
        v=_v;
        w=_w;
    }
}nnn[N];
int main(){
    freopen("Mining.in","r",stdin);
    freopen("Mining.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
    ll n,m;
    cin>>n>>m;
    ll m1=-1,m2=-1;
    bool te=1;
    for(int i=1;i<=n;i++){
        cin>>v[i]>>w[i];
        nnn[i]=node(v[i],w[i]);
        if(m1==-1) m1=w[i];
        else if(w[i]!=m1&&m2==-1)  m2=w[i];
        else if(w[i]!=m1&&w[i]!=m2) te=0;
    }
    if(m<M){
        for(int i=1;i<=n;i++){
            for(int j=m;j>=w[i];j--){
                f[j]=max(f[j],f[j-w[i]]+v[i]);
            } 
        }
        cout<<f[m];
        return 0;
    }
    if(te){
        if(m2==-1){
            sort(v+1,v+1+n,[](ll x,ll y){
                return x>y;
            }); 
//            for(int i=1;i<=n;i++){
//                cout<<v[i]<<"\n";
//            }
//            return 0;
            ll cnt=m/m1;
            ll ans=0;
            for(int i=1;i<=min(n,cnt);i++) ans+=v[i];
//            cout<<cnt<<"\n";
            cout<<ans;
            return 0;
        }
        int c1=0,c2=0;
        for(int i=1;i<=n;i++){
            if(w[i]==m1) a[++c1]=v[i];
            else b[++c2]=v[i];
        }
        sort(a+1,a+1+c1,[](ll x,ll y){
            return x>y;
        });
        sort(b+1,b+1+c2,[](ll x,ll y){
            return x>y;
        });
        for(int i=1;i<=c1;i++) a[i]+=a[i-1];
        for(int i=1;i<=c2;i++) b[i]+=b[i-1];
        ll ans=0;
        for(int i=0;i<=c1;i++){
            ll s=m-i*m1;
            if(s<0) break;
            ans=max(ans,a[i]+b[s/m2]);
        }
        cout<<ans;
        return 0;
    }
    sort(nnn+1,nnn+1+n,[](node x,node y){
        return x.v>y.v;
    });
    ll ans=0;
    for(int i=1;i<=n&&m;i++){
        if(nnn[i].w<=m){
            ans+=nnn[i].v;
            m-=nnn[i].w;
        }
    }
    cout<<ans;
    return 0;
}