BZOJ2802Warehouse Store题解
我太菜了,连贪心题都不会写。。。
贪心思路很简单,我们能满足顾客就满足他,如果满足不了,就看之前的顾客中
有没有需求比该顾客多的顾客,如果有的话改为卖给这位顾客会使解更优
所以我们用一个优先队列维护一下所有卖的顾客,然后每此判断一下就好了
# include<iostream> # include<cstdio> # include<algorithm> # include<cstring> # include<cmath> # include<queue> using namespace std; typedef long long LL; priority_queue<pair<int,int> > q; const int mn = 250005; int n; int a[mn],b[mn],st[mn],cnt; bool vis[mn]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); LL now=0; for(int i=1;i<=n;i++) { now+=a[i]; if(now-b[i]>=0) { q.push(make_pair(b[i],i)); vis[i]=1; now-=b[i]; } else if(!q.empty()){ pair<int,int> tmp=q.top(); if(tmp.first>b[i] && now+tmp.first-b[i]>=0) { q.pop(); vis[tmp.second]=0; now=now+tmp.first-b[i]; vis[i]=1; q.push(make_pair(b[i],i)); } } } for(int i=1;i<=n;i++) if(vis[i]) st[++cnt]=i; printf("%d\n",cnt); for(int i=1;i<=cnt;i++) printf("%d ",st[i]); return 0; }