首页 > 代码库 > ZOJ 3334 Body Check 贪心算法

ZOJ 3334 Body Check 贪心算法

题目大意:

有m个医生和n个病人,每个病人检查身体的时间已知。医生必须同时工作或者只有一个人工作,求出检查完所有病人的最少时间。(同一时刻一个病人只能由一个医生检查,医生同时也只能检查一个病人,但是当病人没检查完医生可以换人)

思路:

检查完所有病人的时间和医生同时工作的时间有关,病人检查病的时间分为两个,一个是同时检查时间,剩下的就是一个医生检查的时间,答案就是SUM(病人检查时间)-(m)*共同工作的时间+共同工作的时间。


可以二分共同工作的时间,满足SUM(min(共同工作时间,病人所需时间))>m*共同工作时间。既保证要能够有这么多的共同工作时间。

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const double eps = 1e-8;
int m,n;
double patient[1005];
int sig(double k)
{
    if(fabs(k)<eps) return 0;
    return k>0?1:-1;
}
int main(){
    while(scanf("%d%d",&m,&n)!=EOF){
        double sum = 0,maxx = 0;
        for(int i=0;i<n;i++){
            scanf("%lf",&patient[i]);
            sum+=patient[i];
        }
        double l = 0,r = sum;
        double ans = 0;
        while(sig(r-l)){
            double user = 0;double mid = (l+r)/2;
            for(int i=0;i<n;i++){
                user+=min(patient[i],mid);
            }
            if(sig(user-mid*m)<0)r=mid;
            else{
                l = mid;
            }
        }
        printf("%.4lf\n",sum-r*(m-1));
    }
}


ZOJ 3334 Body Check 贪心算法