[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\n",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 }