比赛 2026.9.5 评测结果 AAEEEAEEEEEAWWWWWWAAAAAAE
题目名称 Asteroid Mining 最终得分 40
用户昵称 杨蕙宇 运行时间 2.580 s
代码语言 C++ 内存使用 8.76 MiB
提交时间 2026-09-05 11:57:36
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
const int M=1e4+10;
const int lN=1e3+10;
typedef long long ll;
const ll INF=1e18;
bool f;//是否有不相同的m 
int n,m;
struct node{
    ll v,w;
}e[N];
bool cmp(node x,node y){
    return x.v>y.v;
}
ll dp[M];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    freopen("Mining.in","r",stdin); 
//    freopen("d1p1.3-52.in","r",stdin); 
    freopen("Mining.out","w",stdout); 
    cin>>n>>m;
    cin>>e[1].v>>e[1].w;
    for(int i=2;i<=n;i++){
        cin>>e[i].v>>e[i].w;
        if(e[i].w!=e[1].w)f=1;
    }
    if(!f){
        ll ans=0;
        sort(e+1,e+1+n,cmp);
        for(int i=1;i<=n;i++){
            if(m>=e[i].w)ans+=e[i].v,m-=e[i].w;
            else break;
        }
        cout<<ans;
    }
    else{
        ll ans=0;
        for(int i=0;i<=m;i++)dp[i]=0;
        dp[0]=0;
        for(int i=1;i<=n;i++){
            for(int j=m;j>=0;j--){
                if(j>=e[i].w)dp[j]=max(dp[j],dp[j-e[i].w]+e[i].v);
            }
        } 
        for(int i=m;i>=0;i--){
            if(dp[i]==INF)continue;
            else ans=max(ans,dp[i]);
        }
        cout<<ans;
    }
    return 0;
}