博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Allowance POJ - 3040
阅读量:5056 次
发布时间:2019-06-12

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

题意

1 给出n种面值的货币, 并给出数量, 每次去除C元钱, 问最短能取多少回

分析

1 面值比c大的直接当一次

2 面值比C小的贪心求解, 具体分析在注释里

参考代码

struct T{ int value,num; bool operator<(const T&a) {     return value< a.value; }};T ar[23];int need[20+6];int main(void){   int N,C;   while(cin>>N>>C)   {       int sum = 0;       int number = 0;      fo1(i,N)      {          int a,b;          cin>>a>>b;          if(a>=C)//大于C的情况            sum+=b;          else          {              ar[number].value = a;              ar[number++].num = b;          }      }     sort(ar,ar+number);//按面值大小排序//     cout<
<
=0;--i)//从大面值到小面值遍历,使得总和小于等于C { if(ar[i].num)//如果还有剩余 { need[i] = min(ar[i].num,tmp/ar[i].value);//最多能用第i中面值的货币多少被 tmp -= need[i]*ar[i].value; }// if(tmp==0)// break; } for(int i = 0;i < number; ++i)//从小到到大遍历,使得总和大于等于C { int d = min(ar[i].num-need[i],(tmp+ar[i].value-1)/ar[i].value);//这个是重点, 使得总和大于C<=sum
0)//如果剩下的钱不够C break; else { int t = INF;//t代表这种组合最多能取多少次 for(int i = 0;i < number; ++i) { if(need[i]) t = min(t,ar[i].num/need[i]); } for(int i = 0;i

转载于:https://www.cnblogs.com/zzuzxy/p/8542639.html

你可能感兴趣的文章
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>
Android 内存泄漏优化总结
查看>>