1 条题解

  • 0
    @ 2026-5-8 19:31:48

    小广告:双倍经验

    废话不多说,来看题解。


    题目传送门

    很显然,使用反悔贪心。

    题目大意

    题目说,TA (以下简称 T ) 每次可以比赛,收集勋章,然后用来升级,但是只能在等级 LiL_i 及以下才能参加这场比赛,然后提升 XiX_i 级等级和获得 11 枚勋章。

    T 可以按任意顺序参加这些比赛,尽可能多拿徽章,问 T 最多可以获得多少徽章。

    思路

    排序

    你可能第一次会认为是按照 LL 排序比赛内容,这很有可能是错的,因为如果你通过的第 nn 个比赛但并不需要通过后的 LiL_i 尽量小,所以会错。我们应该按 XX 来排序。

    反悔贪心的内容

    当 T 对当前这一个比赛无法满足时,T 会去替换掉前面比赛中 AA 值最大的一场,所以我们要使用大根堆。

    堆(优先队列)在

    :::success[AC代码]{open} 不要只动鼠标哦!

    #include<bits/stdc++.h>
    using namespace std;
    long long n,t;
    long long cnt;
    struct node
    {
    	long long d,p;
    }a[10000005];
    bool cmp(node a,node b)
    {
    	return a.p+a.d<b.p+b.d;
    }
    priority_queue<long long> q;
    int main(){
    	cin>>n;
    	for(long long i=1;i<=n;i++)
        {
    		cin>>a[i].p;
    	}
        for(long long i=1;i<=n;i++)
        {
    		cin>>a[i].d;
    	}
        
        sort(a+1,a+n+1,cmp);
        
    	for(long long i=1;i<=n;i++)
        {
    		if(a[i].d<t)
            {
    			if(a[i].p<q.top())
                {
    				t=t-q.top()+a[i].p;
    				q.pop();
    				q.push(a[i].p);
    			}
    		}
            else
            {
    			q.push(a[i].p);
    			cnt++;
        		t+=a[i].p;
    		}
    	}
    	cout<<cnt;
    	return 0;
    }
    

    我的 AC 记录

    :::

    :::info[updata]{close}

    2026/2/21 之前不记录。

    2026/2/21:将 “[这]。(https://www.luogu.com.cn/paste/h42bv90a) ” 改为 “。”

    :::

    • 1

    信息

    ID
    10998
    时间
    1500ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者