ZOJ-3021 Satan. Go Away (精度二分)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3021

题意:先给你N,K,L,M四个数。然后是学期结束要给老师评分,老师的平均分低于 L 分就会被解雇。每个人可以评 1 到 N 的整数分,现在已经有 M 个人评分了,这 M 个人评分后老师的平均分是 K 。现在问你最少还要投多少票可以让这个老师被解雇。

为了让老师被解雇,那么最少需要的这几个人都给老师打1分就可以。然后用二分枚举最少需要的人数就可以。要注意的是这个题会卡精度…

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
double k,l;
ll n,m;

bool check(ll x){
    double xx;
    if(n == k)  xx = floor(m * k);
    else xx = floor(m * (k + 0.049999999999));
    xx += x;
    xx /= (m+x);
    return xx < l;
}

int main(){
    while(~scanf("%lld%lf%lf%lld",&n,&k,&l,&m)){
        l += 0.049999999999;
        ll L = 0,R = 1e16,ans = -1,mid;
        while(L <= R){
            mid = (R-L)/2 + L;
            if(check(mid)){
                ans = mid;
                R = mid - 1;
            }
            else L = mid + 1;
        }
        printf("%lld\n",ans);
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值