本题当中自我感觉很开窍的地方,我们给付款金额加上0.00001,这样就能保证我的数据最起码是大于面值的,最后的余额再跟0.00001比较,如果小于其就是可以完全换成金币个数的。注意这里不能是等于0.00001,因为确实是两个数不相等,而且即便你将调试显示的数抄上去都不行!!!
===================================================================
/**
思路:1.map容器进行存储 键值为面值(0.05,0.1,0.2,0.5,1,2) 关键值为对应的硬币个数
2.将付款金额跟面值进行比较,找到刚好大于其面值的银币,并判断其个数是否有无,
1>:如果其个数为0就继续往下寻找银币,直到银币个数不为0为止
2>:如果其个数不为0的话那么我们就选择 小于 付款金额的 银币数 并记录个数
付款金额 = 付款金额 - 面值*银币数;
当付款金额小于面值的时候继续往下寻找更小的面值
当银币数不够了也是往下继续寻找最小隐蔽数
3.如果最后的付款金额不为0,那么就是 impossible
测试数据:2
2 4 2 2 1 0 0.95
2 4 2 0 1 0 0.55
4.注意处理数据中的小数问题,因为double 存的数据和真实的并不一样
eg :比如存入的是0.95 其实是0.9499999999182,那么当数据剩下0.0499909
那么它和0.05就无法比较了
*/
#include<bits/stdc++.h>
using namespace std;
int res(vector& v){
map<double,double>m;
map<double,double>:: reverse_iterator t;
int length = v.size();
float pay = 0.00001; //付款金额
int cnt = 0;//统计银币个数
for(int i = length - 1; i >= 0; i–){
if(i == 0) m[0.05] = v[i];
if(i == 1) m[0.1] = v[i];
if(i == 2) m[0.2] = v[i];
if(i == 3) m[0.5] = v[i];
if(i == 4) m[1] = v[i];
if(i == 5) m[2] = v[i];
if(i == 6) pay += v[i];
}
for(t = m.rbegin(); t != m.rend(); t++){
if(pay >= t->first && t->second != 0){//如果付款金额大于其面值 并且该面值银币数不为0
for(int i = 0; i < t->second; i++){
if(pay >= t->first){//这里确保每次的付款金额均大于面值
pay = pay - t->first;
cnt++;
}else{
break;
}
}
}
}
//cout << cnt;
// cout << pay << endl;
//0.00999999139
if(pay <= 0.001){
return cnt;
// cout << “wyj”;
}
return -1;
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
vectorv;
for(int i = 0; i < 7; i++){
double nums;
cin >> nums;
v.push_back(nums);
}
int ans = res(v);
if(ans == -1){
cout << “impossible” << endl;
}else{
cout << ans << endl;
}
}
}
//2
//2 4 2 2 1 0 0.95
//2 4 2 0 1 0 0.55
//
//
//1
//2 4 2 2 1 0 0.95
//1
//2 4 2 2 1 0 0.05
//
//1
//2 4 2 2 1 0 0.95
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
最后
看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面
小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>
针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
[外链图片转存中…(img-QAiAFqUu-1711572039596)]
[外链图片转存中…(img-caHVwZU7-1711572039596)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!