题目描述

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

P3545 [POI2012]HUR-Warehouse Store的更多相关文章

  1. BZOJ2802: [Poi2012]Warehouse Store

    2802: [Poi2012]Warehouse Store Time Limit: 10 Sec  Memory Limit: 64 MBSec  Special JudgeSubmit: 121  ...

  2. 【BZOJ 2802】 2802: [Poi2012]Warehouse Store (贪心)

    2802: [Poi2012]Warehouse Store Description 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择 ...

  3. bzoj 2802 [Poi2012]Warehouse Store STL

    [Poi2012]Warehouse Store Time Limit: 10 Sec  Memory Limit: 64 MBSec  Special JudgeSubmit: 621  Solve ...

  4. BZOJ2802——[Poi2012]Warehouse Store

    1.题目巨短,自己看看吧 2.分析:这道题,想了半天dp还是想不到,最后看题解发现是个贪心的思想,我们维护一个堆,如果这个人不能加入就把他和堆上最大的进行比较,然后搞搞就行了 #include < ...

  5. 【BZOJ】2802: [Poi2012]Warehouse Store(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2802 自己yy了一下... 每一次如果够那么就买. 如果不够,考虑之前买过的,如果之前买过的比当前花 ...

  6. BZOJ2802 [Poi2012]Warehouse Store 【贪心】

    题目链接 BZOJ2802 题解 这样的问题通常逆序贪心 每个\(A[i]\)只能用来满足后面的\(B[i]\) 就用当前\(A[i]\)不断提供给最小的\(B[i]\)即可 用一个堆维护 #incl ...

  7. 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆

    题目描述 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他.如果要满足顾客的需求,就必须要有足够的库存.问 ...

  8. bzoj2802 [Poi2012]Warehouse Store 贪心+堆

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2802 题解 我一开始想到了一个比较麻烦的做法. 把每一天按照 \(b_i\) 从小到大排序,\ ...

  9. [bzoj2802][Poi2012]Warehouse Store_贪心_堆

    Warehouse Store bzoj-2802 Poi-2012 题目大意:一家商店的连续n天内,每一天会进货$a_i$个,有且只有一个客人回来买$b_i$个,问至多满足多少人. 注释:$1\le ...

随机推荐

  1. 【API进阶之路】破圈,用一个API代替10人内容团队

    摘要:我用一个API代替10人内容团队,一年帮老板省了一百万. 自从学习API以后,我用技术手段相继帮助业务部.市场部解决了不少难题,算是从纯研发破圈发展到了业务端.老板召开业务讨论会的时候也会带上我 ...

  2. day45:JS中的json&JS的BOM操作和DOM操作

    目录 1.补充:CSS中的弹性盒子 2.JS中json的序列化 3.JS中的BOM操作 3.1 location操作 3.2 计时器 4.JS中的DOM操作 4.1 创建标签 4.2 查找标签 4.3 ...

  3. JDK15就要来了,你却还不知道JDK8的新特性!

    微信搜「烟雨星空」,白嫖更多好文. 现在 Oracle 官方每隔半年就会出一个 JDK 新版本.按时间来算的话,这个月就要出 JDK15 了.然而,大部分公司还是在使用 JDK7 和 8 . 之前去我 ...

  4. Vue事件绑定原理

    Vue事件绑定原理 Vue中通过v-on或其语法糖@指令来给元素绑定事件并且提供了事件修饰符,基本流程是进行模板编译生成AST,生成render函数后并执行得到VNode,VNode生成真实DOM节点 ...

  5. 时间选择器 element

    <el-date-picker type="datetime" placeholder="选择上线日期" :picker-options="st ...

  6. 04router

    1.以 / 开头的嵌套路径会被当作根路径.一级路由可以放在二级router-view里面 实现的效果是页面嵌套 { path: '/console', name: 'console', compone ...

  7. [翻译] 发布双屏预览SKD,公布MICROSOFT 365开发者日日期

    [前置提示]:本文翻译工作尚未完工,您可以先看原文QUQ 原文标题:Announcing dual-screen preview SDKs and Microsoft 365 Developer Da ...

  8. 一文带你了解Sql优化

    我们后台开发人员每天都难免与数据库打交道,那么你在写sql语句的时候有注重到自己sql的效率吗?当你sql查询速度很慢的时候你有想过是你的sql语句造成的吗?看完这篇文章,我相信你会对sql优化有了一 ...

  9. 【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 II、路径总和、求根到叶子节点数字之和(DFS)

    总述 全部用DFS来做 重点一:参数的设置:为Root,路径字符串,路径List集合. 重点二:步骤: 1 节点为null 2 所有节点的操作 3 叶子结点的操作 4 非叶节点的操作 题目257. 二 ...

  10. [LeetCode]647. 回文子串(DP)

    ###题目 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc&q ...