ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3545 [POI2012]HUR-Warehouse Store

2020-08-03 18:31:14  阅读:269  来源: 互联网

标签:POI2012 LL long P3545 商品 满足 Warehouse 顾客 include


题目描述

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

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

输入格式

第一行包含一个整数n,表示有n天。

第二行有n个整数ai,表示第i天上午进货a件商品。

第三行包含n个整数bi,表示在第i天中午有顾客来买b件商品。

输出格式

第一行一个整数,表示最多能满足几天中顾客的需求。

第二行输出满足这么哪些天顾客的需求。

输入输出样例

输入 #1

6
2 2 1 2 1 0
1 2 2 3 4 4

输出 #1

3
1 2 4

说明/提示

对于100%的数据,1⩽n⩽250000,0⩽ai,bi⩽10^9

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

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

这是一道很经典的贪心题

贪心策略:当能满足当前所有人时满足当前所有人。

但当不能满足时,就会出现错误。

那我们怎么保证贪心的正确行呢?

当我们不能满足时,我们可以看看前面的人,看看满足这个人是不是更优。

假如,当前这个人要比前面买的最多的人都要多,那我们可以不买给

这个人,以此来留下更多的商品,满足剩下的人。

如果比前面买的最多的人都要少,说明满足这个人要更优,

因为他可以剩下更多的商品,来满足剩下的人。

那我们就可以考虑维护一个大跟堆,每次把人的序号和他买的商品数

加入堆中,然后按照上述方法维护就行了。

几个注意的点

  1. 在删除大根堆堆顶时,一定要判断这个堆是否为空。否则就会疯狂RE

  2. 一定要开 long long(不开long long见祖宗

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define LL long long
using namespace std;
LL n,ans;
LL a[300010],b[300010];
bool vis[300010];
priority_queue<pair<LL,int>, vector< pair<LL,int> > >q;//维护一个大根堆
int main()
{
	scanf("%lld",&n); LL rest = 0;
	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(b[i] <= rest)//剩下的商品数,要比这个人买的要多,则可以满足
		{
			ans++;
			q.push(make_pair(b[i],i));
			rest -= b[i];//rest存剩下的商品数
			vis[i] = 1;
		}
		else if(!q.empty() && b[i] < q.top().first)//一定要判堆是否为空
		{
            int t = q.top().second; q.pop();//去掉不优的堆顶
            rest += b[t]; rest -= b[i];
            vis[t] = 0, vis[i] = 1;//对要买的商品打标急
            q.push(make_pair(b[i],i));
		}
	}
	printf("%lld\n",ans);
	for(int i = 1; i <= n; i++) if(vis[i]) printf("%d ",i);
	return 0;
}

ENDING

标签:POI2012,LL,long,P3545,商品,满足,Warehouse,顾客,include
来源: https://www.cnblogs.com/genshy/p/13427940.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有