题目链接
http://main.edu.pl/en/archive/oi/19/hur
题目大意
有一家专卖一种商品的店,考虑连续的n天。
第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他。
如果要满足顾客的需求,就必须要有足够的库存。问最多能够满足多少个顾客的需求。
思路
应该是个很显然的贪心做法吧。类似这样的贪心真的是非常多的了。
维护一个大根堆。从第一天开始往后扫,假如当日剩余库存量足够满足当日的需求订单的话,就标记满足这个订单,并将这个订单中购买商品的数量加入大根堆。若当日剩余库存量不够满足当日的需求订单,且大根堆堆顶的订单大小比当日的订单大小大的话,就弹出堆顶,标记满足当日的订单,并取消掉堆顶的订单,将当日的订单大小加入堆中。
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#define MAXN 260000
using namespace std;
typedef long long int LL;
struct Node
{
int id;
LL val;
Node(){}
Node(int _id,LL _val):id(_id),val(_val){}
};
bool operator<(Node a,Node b)
{
return a.val<b.val;
}
bool operator>(Node a,Node b)
{
return a.val>b.val;
}
priority_queue<Node>heap;
LL a[MAXN],b[MAXN];
int anslist[MAXN];
int main()
{
int n,ans=0;
LL rest=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
for(int i=1;i<=n;i++)
{
rest+=a[i];
if(rest-b[i]<0)
{
if(heap.top().val>b[i])
{
rest+=heap.top().val;
heap.pop();
rest-=b[i];
heap.push(Node(i,b[i]));
}
}
else
{
rest-=b[i];
heap.push(Node(i,b[i]));
}
}
while(!heap.empty())
{
anslist[++ans]=heap.top().id;
heap.pop();
}
sort(anslist+1,anslist+ans+1);
printf("%d\n",ans);
for(int i=1;i<=ans;i++)
printf("%d ",anslist[i]);
printf("\n");
return 0;
}