[POI2012]HUR-Warehouse Store(贪心,堆)

题意

n天。第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他。

如果要满足顾客的需求,就必须要有足够的库存。问最多能够满足多少个顾客的需求。

(n<=250000)

题解

一看就知道是贪心。

我们把选择的每一天扔到一个堆里,按Bi从大到小排序。

 每一天商品能买就买。买不了就查找堆顶元素,如果堆顶元素大于Bi则弹掉堆顶,把当前Bi扔进去(等于弹出来的那天没买,当前天买了)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<queue>
 7 using namespace std;
 8 const long long N=300000;
 9 struct Node{
10     long long id,w;
11     bool operator <(const Node &a)const{
12         return a.w>w;
13     }
14 }node;
15 priority_queue<Node> q;
16 long long n,a[N],b[N],tot,ans,tmp,c[N];
17 bool cmp(long long x,long long y){
18     return x<y;
19 }
20 int main(){
21     scanf("%lld",&n);
22     for(long long i=1;i<=n;i++){
23         scanf("%lld",&a[i]);
24     }
25     for(long long i=1;i<=n;i++){
26         scanf("%lld",&b[i]);
27     }
28     for(long long i=1;i<=n;i++){
29         tot+=a[i];
30         if(b[i]<=tot){
31             tot-=b[i];
32             node.id=i;
33             node.w=b[i];
34             q.push(node);
35             ans++;
36         }
37         else if(!q.empty()&&b[i]<q.top().w){
38             node=q.top();
39             q.pop();
40             tot+=node.w;
41             tot-=b[i];
42             node.id=i;
43             node.w=b[i];
44             q.push(node);
45         }
46     }
47     printf("%lld
",ans);
48     while(!q.empty()){
49         c[++tmp]=q.top().id;
50         q.pop();
51     }
52     sort(c+1,c+1+tmp,cmp);
53     for(long long i=1;i<=tmp;i++){
54         printf("%lld ",c[i]);
55     }
56     return 0;
57 } 
原文地址:https://www.cnblogs.com/Xu-daxia/p/9436759.html