CCF 201612-2 工资计算
作者:互联网
读完题马上就想到了二分答案,但是就是写了半天才写出来。
在二分的时候精度的缺失是问题所在。
#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