二分枚举共同工作时间在判断是否可行即可
Due to the spread of H1N1 all over the world, the king of Kingdom atouSK is so afraid that he decides to ask all his people to do a body check, no matter how much money it will take. Thus, the king calls up m of the best doctors across the kingdom to finish the task. The docotrs of Kingdom atouSK are selfish. If some of them are asked to work while others of them can take a rest, the docotrs who need to work will get angry and make mistakes at their work time. However, there is one exception, when just one of them needs to work and the others can have a rest, the other doctors will be united and report to the king if the working doctor makes mistakes, so the working doctor needs to do the job alone carefully (How poor!). Therefore, all the m docotrs need to work together or only one of them does the work at certain time.
There are n people in Kingdom atouSK, and it takes different people differnt time to finish the body check. A person can do parts of the check by one doctor and later move to another doctor to continue the check. In other words, a person can do any part of the body check by any docotr at any time, all depending on the doctors' arrangement. But of course, a person CANNOT do the check by two or more doctors at the same time! Suppose the chosen m docotrs are so excellent that they all work at the same efficiency, but they should be focused and each CANNOT check more than one people at the same time.
Though the king doesn't care about the money, he is so concerned about the time to finish all the checks, because the later all the checks finish, the more likely the disease will spread. The king is too busy, so he asks you to calculate the shortest time needed to finish all the body checks.
Input
There may be multiple cases. In each case, there are two integers in the first line, m (0 < m <= 1000) and n (0 < n <= 1000). In the second line, there are n positive real numbers, the ith one indicating the time needed for the ith person to finish the check, not exceeding 1000000.
Output
Output the shortest time needed to finish all the body checks in one line for each case.
Answer having a relative error less than 1e-9 will be accepted.
Sample Input
3 2 1.0 2.0 2 2 1.0 2.0 2 3 1.00 2.0 3.0
Sample Output
3.0000 2.0000 3.0000
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define eps 1e-8
double tog;
double t[1100];
int n,m;
int sig(double k)
{
if(fabs(k)<eps) return 0;
return k>0?1:-1;
}
bool jud(double k)
{
double ck=0;
for(int i=0;i<m;i++)
ck=ck+min(t[i],k);
if(sig(ck-k*n)<0) return true;
return false;
}
int main()
{
while(cin>>n>>m)
{
double sum,l,r,mid;
sum=l=r=0;
for(int i=0;i<m;i++)
{
cin>>t[i];
r+=t[i];
}
sum=r;
while(sig(l-r)<0)
{
mid=(l+r)/2;
if(jud(mid)) r=mid;
else l=mid;
}
printf("%.4lf\n",sum-(n-1)*r);
}
return 0;
}