【BZOJ 2802】 2802: [Poi2012]Warehouse Store (贪心)
2802: [Poi2012]Warehouse Store
Description
有一家专卖一种商品的店,考虑连续的n天。
第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他。
如果要满足顾客的需求,就必须要有足够的库存。问最多能够满足多少个顾客的需求。Input
第一行一个正整数n (n<=250,000)。
第二行n个整数A1,A2,...An (0<=Ai<=10^9)。
第三行n个整数B1,B2,...Bn (0<=Bi<=10^9)。Output
第一行一个正整数k,表示最多能满足k个顾客的需求。
第二行k个依次递增的正整数X1,X2,...,Xk,表示在第X1,X2,...,Xk天分别满足顾客的需求。Sample Input
6
2 2 1 2 1 0
1 2 2 3 4 4Sample Output
3
1 2 4HINT
Source
【分析】
可爱的贪心题。
【并没有秒,并且表示想了很久,并且表示样例调了挺久】
【幸好1A】【好吧学不会大颓果的来者不拒思想ORZ】
先说我的方法:
每次选最小的bi取,然后库存减掉,树状数组维护前缀和。
减库存的时候从当前位置往前减,减到0为止,不过这样会很慢,我用个链表维护,如果是0就直接跳过去了。
【实测不用链表真心TLE。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
#define Maxn 250010
#define LL long long int a[Maxn],b[Maxn],c[Maxn];
LL d[Maxn];
int lt[Maxn],nt[Maxn]; bool cmp(int x,int y)
{
if(b[x]==b[y]) return x>y;
return b[x]<b[y];
} int n; void add(int x,int y)
{
for(int i=x;i<=n;i+=i&(-i))
d[i]+=y;
} LL query(int x)
{
LL ans=;
for(int i=x;i>=;i-=i&(-i))
ans+=d[i];
return ans;
} int op[Maxn]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&b[i]);
for(int i=;i<=n;i++) c[i]=i;
memset(d,,sizeof(d));
for(int i=;i<=n;i++) add(i,a[i]);
for(int i=;i<=n;i++) nt[i]=i+;
for(int i=;i<=n;i++) lt[i]=i-;
for(int i=;i<=n;i++) if(a[i]==)
{
lt[nt[i]]=lt[i];
nt[lt[i]]=nt[i];
}
sort(c+,c++n,cmp);
op[]=;
for(int i=;i<=n;i++)
{
if(query(c[i])>=b[c[i]])
{
op[++op[]]=c[i];
int nw=c[i];
while(nw&&a[nw]<=b[c[i]])
{
add(nw,-a[nw]);
b[c[i]]-=a[nw];
a[nw]=;
lt[nt[nw]]=lt[nw];
nt[lt[nw]]=nt[nw];
nw=lt[nw];
nw--;
}
if(b[c[i]])
{
a[nw]-=b[c[i]];
add(nw,-b[c[i]]);
}
}
}
sort(op+,op++op[]);
printf("%d\n",op[]);
for(int i=;i<=op[];i++) printf("%d ",op[i]);
printf("\n");
return ;
}
方法二:【来者不拒】
能选的先选,选了的bi用一个最大堆维护,如果不行就把最大的bi弄出来让现在的满足。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 250010
#define LL long long struct node
{
int x,id;
friend bool operator < (node x,node y)
{
return x.x<y.x;
}
}; priority_queue<node > q; int a[Maxn],b[Maxn];
bool mark[Maxn]; int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&b[i]);
LL now=;
int cnt=;
while(!q.empty()) q.pop();
memset(mark,,sizeof(mark));
for(int i=;i<=n;i++)
{
now+=a[i];
if(now>=b[i])
{
mark[i]=;
cnt++;
q.push((node){b[i],i});
now-=b[i];
}
else if(!q.empty()&&q.top().x>b[i])
{
now+=q.top().x-b[i];
mark[q.top().id]=;
mark[i]=;
q.pop();
q.push((node){b[i],i});
}
}
printf("%d\n",cnt);
for(int i=;i<=n;i++) if(mark[i])
printf("%d ",i);printf("\n");
return ;
}
2017-01-21 10:47:36
【BZOJ 2802】 2802: [Poi2012]Warehouse Store (贪心)的更多相关文章
- bzoj2802 [Poi2012]Warehouse Store 贪心+堆
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2802 题解 我一开始想到了一个比较麻烦的做法. 把每一天按照 \(b_i\) 从小到大排序,\ ...
- 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆
题目描述 有一家专卖一种商品的店,考虑连续的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
2802: [Poi2012]Warehouse Store Time Limit: 10 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 121 ...
- [bzoj2802][Poi2012]Warehouse Store_贪心_堆
Warehouse Store bzoj-2802 Poi-2012 题目大意:一家商店的连续n天内,每一天会进货$a_i$个,有且只有一个客人回来买$b_i$个,问至多满足多少人. 注释:$1\le ...
- 【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
1.题目巨短,自己看看吧 2.分析:这道题,想了半天dp还是想不到,最后看题解发现是个贪心的思想,我们维护一个堆,如果这个人不能加入就把他和堆上最大的进行比较,然后搞搞就行了 #include < ...
- BZOJ_2802_[Poi2012]Warehouse Store_堆+贪心
BZOJ_2802_[Poi2012]Warehouse Store_堆+贪心 Description 有一家专卖一种商品的店,考虑连续的n天. 第i天上午会进货Ai件商品,中午的时候会有顾客需要购买 ...
随机推荐
- 【zoj3645】高斯消元求解普通线性方程
题意: 给你一个方程组(含有12个方程),求(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11) 方程组的形式是一个二次方程组 (ai1-x1)^2 + (ai2-x2)^2 +( ...
- 51nod 1106 质数检测——Mr判素数
质数检测一般都是根号n的写法 当然Mr判素数的方法可以实现log的复杂度2333 Mr判素数的话 我们根据费马小定理只要P是素数 那么另一个素数x 满足 x^P-1≡1(mod P) 同时 x^2%P ...
- 课下加分项目 MYPWD 20155335 俞昆
Mypwd 的解读与实现 20155335 linux下pwd命令的编写 实验要求: 1 .学习pwd命令 2 . 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 .实现my ...
- 如何设计一个优雅健壮的Android WebView?(下)
转:如何设计一个优雅健壮的Android WebView?(下) 前言 在上文<如何设计一个优雅健壮的Android WebView?(上)>中,笔者分析了国内WebView的现状,以及在 ...
- 01-QQ 3-最终重构版
Demo示例程序源代码
源代码下载链接:01-QQ 3.zip292.5 KB // QQAppDelegate.h Map // // QQAppDelegate.h // 01-QQ // // Created ...
- 消息队列之 ActiveMQ(山东数漫江湖)
简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...
- perl6中函数参数(1)
sub F($number is copy){ $number++; say $number; } F(); #下面是错误的 sub F($number){ $number++; say $numbe ...
- netcat、nc工具随记
netcat又称nc工具,其最主要的作用就是建立连接并返回两个数据流,剩下的就看各位的想象力了,想象力是很重要的,这也是这个工具的强大之处的所在,所以重要的东西才要说三遍,想象力! 具体参数如下: - ...
- [一] sqlinject bypass
http://103.238.227.13:10087/?id=1 由源码来看是没有办法注入的,几乎都是过滤了的.但是经过测试加<>符号会被直接替换为空. 那么就可以借助此进行bypass ...
- 【swupdate文档 二】许可证
许可证 SWUpdate是免费软件.它的版权属于Stefano Babic和其他许多贡献代码的人(详情请参阅实际源代码和git提交信息). 您可以根据自由软件基金会发布的GNU通用公共许可证第2版的条 ...