标签:int 工资 ans 201612 1500 double CCF 80000 9000
读完题马上就想到了二分答案,但是就是写了半天才写出来。
在二分的时候精度的缺失是问题所在。
#include<iostream> using namespace std; int k; double Cal(double A) { double n = A-3500 , ans = 0; if(A <= 3500) return A; if(n > 80000) { ans += (n-80000)*0.45; n = 80000; } if(n > 55000) { ans += (n-55000)*0.35; n = 55000; } if(n > 35000) { ans += (n-35000)*0.30; n = 35000; } if(n > 9000) { ans += (n-9000)*0.25; n = 9000; } if(n > 4500) { ans += (n-4500)*0.20; n = 4500; } if(n > 1500) { ans += (n-1500)*0.10; n = 1500; } if(n > 0) { ans += n*0.03; } return A-ans; } bool check(double mid) { if(Cal(mid) <= k) { return true; } else return false; } int Find(int n) { double eps = 1e-5;//精度 double l = 1 , r = 100000000; while(eps<r-l) { double mid=(l+r)/2; if(check(mid)) l=mid; else r= mid; } return l+0.05; } int main() { cin >> k; // cout << Cal(k); if(k <= 3500) cout << k; else { cout << Find(k); } }
这个double型的二分模板需要特殊记一下:
int Find(int n) { double eps = 1e-5;//精度 double l = 1 , r = 100000000; while(eps<r-l) { double mid=(l+r)/2; if(check(mid)) l=mid; else r= mid; } return l+0.05; }
还有如何四舍五入:
return l+0.05;
标签:int,工资,ans,201612,1500,double,CCF,80000,9000 来源: https://www.cnblogs.com/LikeFish/p/16213131.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。