比赛 2026.9.5 评测结果 AATTTATTTTTWEEEEEEAAAAAAT
题目名称 Asteroid Mining 最终得分 36
用户昵称 x123456 运行时间 21.431 s
代码语言 C++ 内存使用 280.54 MiB
提交时间 2026-09-05 11:46:22
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
ll m,dp[100000005],cnt,pd[500005];
int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}
struct no{
    ll v,m;
    ll dan;
}a[500005];
bool cmp(no a,no b){
    return a.v>b.v;
}
bool cmp2(no a,no b){
    return a.dan>b.dan;
}
bool cmp3(no a,no b){
    return a.m<b.m;
}
int main(){
    freopen("Mining.in","r",stdin);
    freopen("Mining.out","w",stdout);
    scanf("%d%lld",&n,&m);
    if(n==2){
        int v1,m1,v2,m2;
        scanf("%d%d%d%d",&v1,&m1,&v2,&m2);
        if(m1+m2<=m)printf("%d",v1+v2);
        else if(m1<=m||m2<=m){
            if(m1<=m&&m2>m)printf("%d",v1);
            else if(m2<=m&&m1>m)printf("%d",v2);
            else printf("%d",max(v1,v2));
        }else printf("0");
    }else{
        for(int i=1;i<=n;i++){
            scanf("%lld%lld",&a[i].v,&a[i].m);
            pd[i]=a[i].m;
        }
        int k=unique(pd+1,pd+1+n)-pd-1;
        if(k==1){
            sort(a+1,a+1+n,cmp);
            ll ans=0;
            for(int i=1;i<=m/a[1].m;i++)ans+=a[i].v;
            printf("%lld",ans);
        }else if(k==2){
            ll g=a[1].m,ans=0;;
            for(int i=2;i<=n;i++)g=gcd(a[i].m,g);
            for(int i=1;i<=n;i++)a[i].dan=a[i].v*g/a[i].m;
            sort(a+1,a+1+n,cmp2);
            for(int i=1;i<=n;i++){
                if(m<a[i].m)break;
                ans+=a[i].v;
                m-=a[i].m;
            }
            sort(a+1,a+1+n,cmp3);
            sort(a+1,a+1+n,cmp);
            for(int i=1;i<=n;i++){
                if(m<a[i].m)break;
                ans+=a[i].v;
                m-=a[i].m;
            }
            printf("%lld",ans);
        }
        else{
            for(int i=1;i<=n;i++){
                for(int j=m;j>=a[i].m;j--){
                    dp[j]=max(dp[j],dp[j-a[i].m]+a[i].v);
                }
            }
            printf("%lld",dp[m]);
        }
    }
    
    return 0;
}