其他分享
首页 > 其他分享> > CCF 201612-2 工资计算

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