比赛 2026.9.5 评测结果 AAAAAAWWWWWAWWWWWWAAAAAAW
题目名称 Asteroid Mining 最终得分 52
用户昵称 dream 运行时间 2.387 s
代码语言 C++ 内存使用 13.72 MiB
提交时间 2026-09-05 12:26:14
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500005;
int n;
ll m;
template<typename T>
void read(T &x){
	T sum=0;
	char c;
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9'){
		sum=sum*10+c-'0';
		c=getchar();
	}
	x=sum;
}
template<typename T>
void write(T x){
	if(x>=10){
		write(x/10);
	}
	putchar(x%10+'0');
}
struct node{
	__int128 v,mm;
	__int128 dx;
	bool operator<(const node &t) const{
		return dx>t.dx;
	}
}a[N];
__int128 ans;
void solve2(){
    __int128 mx=0;
    for(int i=1;i<=n;i++){
    	__int128 v,mm;
    	read(v),read(mm);
    	a[i]={v,mm};
    	mx=max(mx,mm);
	}
	for(int i=1;i<=n;i++){
		a[i].dx=mx/a[i].mm*a[i].v;
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		if((m-a[i].mm>=0ll)){
			ans+=a[i].v;
			m-=a[i].mm;
		}
	}	
}
ll va[1005],w[1005];
ll dp[10005];
void solve1(){
    for(int i=1;i<=n;i++){
    	read(va[i]),read(w[i]);
	}
	for(int i=1;i<=n;i++){
		for(int j=m;j>=w[i];j--){
			dp[j]=max(dp[j],dp[j-w[i]]+va[i]);
		}
	}
	ans=dp[m];
}
int main(){
	freopen("Mining.in","r",stdin);
	freopen("Mining.out","w",stdout);
    read(n),read(m);
    if(n<=1000&&m<=10000){
    	solve1();
	}
	else{
		solve2();
	}
	write(ans);
    return 0;
}