【题目大意】:给出n条网线,要你平分给k个人,要求切掉的长度最小,问每个人分得的网线长。
【解题思路】:一看就是单调性很强,一看就是水题。一个二分,没了。之所以写是因为我发现我好久没有写强制类型转换把(int)(a[i]/mid)写成(int)a[i]/mid~而不停的wa啊wa。警醒!
【代码】:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define eps 1e-10
int n,k;
double a[11000];
bool check(double mid){
int cnt=0;
for (int i=0; i<n; i++){
cnt+=(int)(a[i]/mid);
}
if (cnt>=k) return true;
else return false;
}
int main(){
while (~scanf("%d%d",&n,&k)){
if (n==0 && k==0) break;
double maxx=0.00;
for (int i=0; i<n; i++) {
scanf("%lf",&a[i]);
maxx+=a[i];
}
double l=0.00,r=maxx/k;
double mid;
while (l+eps<r){
mid=(l+r)/2;
if (check(mid)) l=mid;
else r=mid;
}
printf("%.2f\n",mid);
}
return 0;
}