蓝桥杯 第十二届国赛真题-巧克力(优先队列 + 贪心)

链接:第十二届国赛真题-巧克力

题意:
在这里插入图片描述

思路:

  1. 第一眼看上去就像贪心,但具体不知道怎么贪,优先选便宜的,或者优先选保质期短的貌似都不行。
  2. 仔细想了想 ,因为我们优先选便宜的可能会导致,让这个巧克力在后面选,且让和它价格差不多的巧克力先选可能更优,所以我们不妨从最后一天开始考虑,把符合要求的巧克力都加入备选集合,然后选择价格最便宜的巧克力,用优先队列维护即可。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
const ll de = 4e10;
const int maxn = 2e6 + 7;
int x , n;
ll ans;
struct node{
    int a , b , c;
    friend bool operator < (node A, node B){
        return A.a > B.a;
    }
}num[maxn];
bool cmp(node A , node B){
    return A.b < B.b;
}
priority_queue<node> que;
int main(){
    scanf("%d%d",&x,&n);
    for(int i = 1; i <= n; i ++){
        scanf("%d%d%d",&num[i].a,&num[i].b,&num[i].c);
    }
    sort(num + 1,num + n + 1 , cmp);
    int pos = n;
    for(int i = x; i >= 1; i --){
        while(num[pos].b >= i){
            que.push(num[pos]);
            pos--;
        }
        if(que.size() == 0){
            ans = -1;
            break;
        }
        node now = que.top();
        que.pop();
        ans += now.a;
        now.c --;
        if(now.c) que.push(now);
    }
    printf ("%lld\n",ans);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值