比赛 2026.9.5 评测结果 AAAAAAWWWWWAWWWWWWAAWWWWW
题目名称 Asteroid Mining 最终得分 36
用户昵称 rzzakioi 运行时间 2.459 s
代码语言 C++ 内存使用 7.16 MiB
提交时间 2026-09-05 12:46:34
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,p[25],ans;
bool vis[25];
struct node{
    int w,v;
}a[500005];
bool operator <(const node &x,const node &y){
    if(x.w==y.w)return x.v>y.v;
    return x.w<y.w;
}
void dfs(int k){
    if(k==n+1){
        memset(p,0,sizeof(p));
        int cnt=0;
        for(int i=1;i<=n;i++){
            if(vis[i])p[++cnt]=i;
        }
        int res=0;
        for(int i=2;i<=cnt;i++){
            if(a[p[i]].w%a[p[i-1]].w!=0)return;
            res+=a[p[i]].w;
        }
        res+=a[p[1]].w;
        if(res>m)return;
        int sum=0;
        for(int i=1;i<=cnt;i++){
            sum+=a[p[i]].v;
        }
        ans=max(ans,sum);
    }
    else{
        for(int i=0;i<=1;i++){
            vis[k]=i;
            dfs(k+1);
            vis[k]=0;
        }
    }
}
signed main(){
    freopen("Mining.in","r",stdin);
    freopen("Mining.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i].v,&a[i].w);
    sort(a+1,a+n+1);
    if(n<=20){
        dfs(1);
        printf("%lld",ans);
    }
    else{
        int sum=0;
        for(int i=1;i<=n;i++){
            sum+=a[i].v;
            if(i*a[i].w<=m)ans=max(ans,sum);
        }
        printf("%lld",ans);
    }
    return 0;
}