1 条题解

  • 0
    @ 2026-8-31 0:45:44

    前言

    NOIP 最成功的部分,补上代码了。

    题目分析

    考虑如果一个东西选好几次那这个东西的 x+yx+y 一定最小,不然替换成最小的一定更优。

    其他肯定选 xx 最小的,枚举选到哪一个,剩下用最小的 x+yx+y 补齐即可。

    时间复杂度 O(nlogn)O(n\log n)

    代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    constexpr int N=1e5+1;
    int n,m,gsum,ans;
    pair<int,int>a[N];
    signed main(){/*
    	freopen("candy.in","r",stdin),
    	freopen("candy.out","w",stdout);*/
    	ios::sync_with_stdio(0);
    	cin.tie(nullptr),cout.tie(nullptr);
    	cin>>n>>m;
    	for(int i=1,x,y;i<=n;i++){
    		cin>>x>>y;
    		a[i]={x,y};
    	}
    	sort(a+1,a+n+1,[](pair<int,int>a,pair<int,int>b)->bool{
    		if(a.first+a.second!=b.first+b.second)
    			return a.first+a.second<b.first+b.second;
    		else
    			return a.first<b.first;
    	});
    	gsum=(a[1].first+a[1].second);
    	sort(a+1,a+n+1,[](pair<int,int>a,pair<int,int>b)->bool{
    		return a.first<b.first;
    	});
    	ans=(m/gsum)*2;
    	for(int i=1,sum=0,cnt=0;i<=n;i++){
    		sum+=a[i].first,cnt++;
    		if(sum>m)
    			break;
    		ans=max(ans,cnt+((m-sum)/gsum)*2);
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    1915
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    11
    已通过
    2
    上传者