博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.08.22 NOIP模拟 shop(lower_bound+前缀和预处理)
阅读量:5313 次
发布时间:2019-06-14

本文共 1247 字,大约阅读时间需要 4 分钟。

Shop

有 n 种物品,第 i 种物品的价格为 vi,每天最多购买 xi 个。

有 m 天,第 i 天你有 wi 的钱,你会不停购买能买得起的最贵的物品。你需要求出你每天会购买多少个物品。

【输入格式】

第一行两个整数 n,m。接下来 n 行每行两个整数 vi,xi。接下来 m 行每行一个整数

wi

【输出格式】

m 行每行一个整数,第 i 行表示第 i 天购买的物品数量。

【输入样例】

3 3

1 1
2 2
3 3
5
10
15

【输出样例】

2

4
6

【数据规模】

对于 20%的数据,n,m<=1000。

对于另外 40%的数据,xi=1。
对于 100%的数据,n,m<=100000,1<=vi<=10^9,1<=xi<=10000,0<=wi<=10^18。

考试唯一A掉的题。。。

预处理出从大到小的后缀和,先查询出最前面能买多少,买完之后有一个性质是之后每买一种商品剩下的钱至少减去一半。
这样的话只需要logw次lower_bound查询就行了。

代码:

#include
#define N 100005#define ll long longusing namespace std;inline ll read(){ ll ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans;}inline void write(ll x){ if(x>9)write(x/10); putchar((x%10)^48);}int n,m;ll sum[N],a[N],b[N],num[N];struct Node{ll v,x;}p[N];inline bool cmp(Node a,Node b){
return a.v
=1&&w>=p[1].v){ int ppos=pos; pos=lower_bound(b+1,b+pos+1,w)-b; if((p[pos].v>w)||pos>ppos)--pos; if(pos<1)break; ll tmp=min(p[pos].x,w/p[pos].v); w-=p[pos].v*tmp,ans+=tmp; --pos; } write(ans),puts(""); } return 0;}

转载于:https://www.cnblogs.com/ldxcaicai/p/9738352.html

你可能感兴趣的文章
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
Java面向对象重要关键字
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>
移动、联通和电信,哪家的宽带好,看完你就知道该怎么选了!
查看>>