巧克力---贪心+堆模拟/优先队列
1.求最少,我用优先队列一直取最小最优的,那么答案也是最小的
2.逆着天进行堆/优先队列模拟
///为什么要逆着天?!
///但如果有一些单价较低且保质期极短的商品,
///和一些单价最低但保质期较长的商品,
///从1到x就不会选择到单价较低的商品。
3.先按保质期从小到大排好序,然后从x到1模拟
4.保质期>=i就可以选,然后pq里top的c--,选最优的
5.c==0就弹出
P8769 [蓝桥杯 2021 国 C] 巧克力 - 洛谷
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<int,int> pii;
struct no
{int w,cc,q;
}a[N];
int x,n;
struct cmp
{bool operator()(const no &a,const no &b)const{if(a.w==b.w) return a.q<b.q;else return a.w>b.w;}
};
bool cmpp(no a,no b)
{return a.q<b.q;
}
priority_queue<no,vector<no>,cmp> pq;
ll an;
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>x>>n;for(int i=0;i<n;i++){cin>>a[i].w>>a[i].q>>a[i].cc;}sort(a,a+n,cmpp);///按保质期从小到大排序 int top=n-1;for(int i=x;i>=1;i--)///逆着天进行堆/优先队列模拟///为什么要逆着天?! ///但如果有一些单价较低且保质期极短的商品,///和一些单价最低但保质期较长的商品,///从1到x就不会选择到单价较低的商品。{while(a[top].q>=i)///大于等于i相当于在i时刻可以选 {pq.push(a[top]);top--;}an+=pq.top().w;///单价最小的,单价相同的日期长的在上面 no t=pq.top();pq.pop();t.cc--;///top的c--,如果是0就弹出去 pq.push(t);if(pq.top().cc==0) pq.pop();}cout<<an;return 0;}