| 比赛 |
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;
}