P3545 [POI2012]HUR-Warehouse Store
题目描述
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件商品,可以选择满足顾客的要求,或是无视掉他。
如果要满足顾客的需求,就必须要有足够的库存。问最多能够满足多少个顾客的需求。
这是一道很经典的贪心题
贪心策略:当能满足当前所有人时满足当前所有人。
但当不能满足时,就会出现错误。
那我们怎么保证贪心的正确行呢?
当我们不能满足时,我们可以看看前面的人,看看满足这个人是不是更优。
假如,当前这个人要比前面买的最多的人都要多,那我们可以不买给
这个人,以此来留下更多的商品,满足剩下的人。
如果比前面买的最多的人都要少,说明满足这个人要更优,
因为他可以剩下更多的商品,来满足剩下的人。
那我们就可以考虑维护一个大跟堆,每次把人的序号和他买的商品数
加入堆中,然后按照上述方法维护就行了。
几个注意的点
在删除大根堆堆顶时,一定要判断这个堆是否为空。否则就会疯狂RE
一定要开 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
P3545 [POI2012]HUR-Warehouse Store的更多相关文章
- BZOJ2802: [Poi2012]Warehouse Store
2802: [Poi2012]Warehouse Store Time Limit: 10 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 121 ...
- 【BZOJ 2802】 2802: [Poi2012]Warehouse Store (贪心)
2802: [Poi2012]Warehouse Store Description 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择 ...
- bzoj 2802 [Poi2012]Warehouse Store STL
[Poi2012]Warehouse Store Time Limit: 10 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 621 Solve ...
- BZOJ2802——[Poi2012]Warehouse Store
1.题目巨短,自己看看吧 2.分析:这道题,想了半天dp还是想不到,最后看题解发现是个贪心的思想,我们维护一个堆,如果这个人不能加入就把他和堆上最大的进行比较,然后搞搞就行了 #include < ...
- 【BZOJ】2802: [Poi2012]Warehouse Store(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=2802 自己yy了一下... 每一次如果够那么就买. 如果不够,考虑之前买过的,如果之前买过的比当前花 ...
- BZOJ2802 [Poi2012]Warehouse Store 【贪心】
题目链接 BZOJ2802 题解 这样的问题通常逆序贪心 每个\(A[i]\)只能用来满足后面的\(B[i]\) 就用当前\(A[i]\)不断提供给最小的\(B[i]\)即可 用一个堆维护 #incl ...
- 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆
题目描述 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他.如果要满足顾客的需求,就必须要有足够的库存.问 ...
- bzoj2802 [Poi2012]Warehouse Store 贪心+堆
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2802 题解 我一开始想到了一个比较麻烦的做法. 把每一天按照 \(b_i\) 从小到大排序,\ ...
- [bzoj2802][Poi2012]Warehouse Store_贪心_堆
Warehouse Store bzoj-2802 Poi-2012 题目大意:一家商店的连续n天内,每一天会进货$a_i$个,有且只有一个客人回来买$b_i$个,问至多满足多少人. 注释:$1\le ...
随机推荐
- pymssql 介绍
pymssql包是Python语言用于连接SQL Server数据库的驱动程序(或者称作DB API),它是最终和数据库进行交互的工具.SQLAlchemy包就是利用pymssql包实现和SQL Se ...
- app转iap
ios打包ipa的四种实用方法(.app转.ipa) http://blog.csdn.net/oiken/article/details/49535369 手动压缩改后缀方式 这种方式与4.1的方法 ...
- vue中饼状图的使用
图形构建子组件 <template> <div> <div id="myChart" :style="echartStyle"&g ...
- Python 零基础快速入门!
“人生苦短,我学python”是编程届的名言.用python写小脚本的便捷性,让很多其他语言的学习者把python当作辅助语言.拥有了某一个语言的功底,再来学习另外一种语言应该是十分快速的.编程理念都 ...
- Zookeeper源码解读
1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...
- 电子邮箱有哪些隐藏技能,读懂了效率提升N倍!
很多人将邮箱作为常见的通讯工具,然而,大部分职场人只了解其五分之一的功能.电子邮箱还有很多隐藏技能,身为商务精英的你,必须往下看看哦!今天跟随TOM邮箱小编导,来挖掘下邮箱的潜藏技能吧~ 作为经常外出 ...
- Java使用数据库连接池连接Oracle数据库
第一步:导入tomcat\lib 下的一个tomcat-dbcp.jar包第二步:在web\META-INF下新建一个context.xml文件,文件内容如下: <?xml version=&q ...
- Java接口讲解
Java中的接口其实就是一套“标准”或者“规范”,比如使用接口实现[电脑对鼠标.键盘使用USB接口的管理],鼠标和键盘他们与接口之间并不存在子类和父类的关系,但是鼠标和键盘又都要通过USB接口插入电脑 ...
- JS语法_其他
严格模式 let obj = { name: 'oceans', } function f1() { with (obj) { console.log(name) } } function f2() ...
- oracle之分组函数
分组函数 5.1 最重要的五个分组函数 sum(); avg(); count(); max(); min(). 数值类型可以使用所有组函数SQL> select sum(sal) sum, a ...