bzoj 1531: [POI2005]Bank notes
来源:互联网 发布:linux 克隆 编辑:程序博客网 时间:2024/05/16 09:22
Description
Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,…, bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币.
Input
第一行一个数 n, 1 <= n <= 200. 接下来一行 n 个整数b1, b2,…, bn, 1 <= b1 < b2 < … < b n <= 20 000, 第三行 n 个整数c1, c2,…, cn, 1 <= ci <= 20 000, 表示每种硬币的个数.最后一行一个数k – 表示要凑的面值数量, 1 <= k <= 20 000.
Output
第一行一个数表示最少需要付的硬币数
Sample Input
3
2 3 5
2 2 1
10
Sample Output
3
分析
神牛:一大早又虐了一道水题。
我:一大晚的还被水题虐。
(来自猥琐YMW)
板子很快敲完然后发现一个严肃的问题
int head=0,tail=0;
本来我这一段是这样的,结果就错了,因为头指针指向零,尾指针也是零,这就表示有一个元素,所以应该改成
int head=1,tail=0;
如果一定要head=0,tail=0的话,那么就表示头指针指向的是头的前一个,所以后面head全变成head+1,head<=tail变成head
int head=0,tail=0; for(int k=j;k<=m;k+=p[i].w) { while(head<tail && w[head+1]<k-p[i].w*p[i].n) head++; while(head<tail && f[k]-(k-w[head+1])/p[i].w<=Q[tail]) tail--; Q[++tail]=f[k]; w[tail]=k; f[k]=std::min(f[k],Q[head+1]+(k-w[head+1])/p[i].w); }
代码
#include <bits/stdc++.h>#define N 50000int read(){ int k=1,x=0; char ch; ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') k=-1; ch=getchar(); } while(ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*k;}struct NOTE{ int w,n;}p[N];int f[N],Q[N],w[N];int n,m;int main(){ n=read(); for(int i=1;i<=n;i++) p[i].w=read(); for(int i=1;i<=n;i++) p[i].n=read(); m=read(); memset(f,127,sizeof(f)); f[0]=0; for(int i=1;i<=n;i++) { for(int j=0;j<p[i].w;j++) { int head=1,tail=0; for(int k=j;k<=m;k+=p[i].w) { while(head<=tail && w[head]<k-p[i].w*p[i].n) head++; while(head<=tail && f[k]-(k-w[head])/p[i].w<=Q[tail]) tail--; Q[++tail]=f[k]; w[tail]=k; f[k]=std::min(f[k],Q[head]+(k-w[head])/p[i].w); } } } printf("%d\n",f[m]);}
0 0
- 【BZOJ 1531】 [POI2005]Bank notes
- bzoj 1531: [POI2005]Bank notes
- BZOJ 1531 POI2005 Bank notes 多重背包
- BZOJ 1531: [POI2005]Bank notes 多重背包
- bzoj 1531: [POI2005]Bank notes 单调队列优化多重背包
- [BZOJ1531] [POI2005]Bank notes
- BZOJ1531/POI2005 Bank notes
- 【BZOJ】【P1531】【POI2005】【Bank notes】【题解】【二进制优化背包】【300T留念】
- 【BZOJ1531】[POI2005]Bank notes【多重背包】
- BZOJ1531——[POI2005]Bank notes
- bzoj1531[POI2005]Bank notes 多重背包
- 【BZOJ 1532】 [POI2005]Kos-Dicing
- BZOJ 1532 [POI2005]Kos-Dicing
- bzoj 1528: [POI2005]sam-Toy Cars
- bzoj 1529: [POI2005]ska Piggy banks
- BZOJ 1529: [POI2005]ska Piggy banks
- BZOJ 1532: [POI2005]Kos-Dicing|网络流
- [构造] BZOJ 1530 [POI2005]Sko-knight Knights
- Ubuntu静态IP简洁配置
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
- HALCON图像处理的粘连零件颗粒计数
- 第十六周 --项目4 -英文单词的基数排序
- 欢迎使用CSDN-markdown编辑器
- bzoj 1531: [POI2005]Bank notes
- 案例4_Android地图定位-百度地图上定位自己所在的位置
- LeetCode-Array-88. Merge Sorted Array
- 10、组件的使用 案例【swiper】
- fuser命令详解
- 如何检测iPhone设备处于低电量模式
- C++动态绑定和虚函数表vtable (动态实现原理)
- php源码之路第八章第一节 (线程,进程和并发)
- Servlet-过滤器