题意:把4段网线分成11段每段至多多长。
现在总结一下二分的思想和步骤吧:
1.找到二分标准,就是对什么进行二分
2.找到两个临界点
3.判断mid时,是否满足条件,然后视情况更新l和r的值
4.我认为最重要的是while()括号内的条件选择,特别是对这种卡精度的题。
#include<stdio.h>
#include<math.h>
const int MAXN = 1*1e4+10;
double a[MAXN];
int n,t;
bool judge(double mid) {
int cnt=0;
for(int l=0; l<n; l++) {
cnt+=(a[l]/mid);
}
return cnt>=t;
}
int main() {
while(scanf("%d%d",&n,&t),n||t) {
double sum=0.0;
for(int l=0; l<n; l++) {
scanf("%lf",&a[l]);
sum+=a[l];
}
double l=0,r=sum/t;
double mid;
while(fabs(l-r)>1e-5) {
mid=(l+r)/2;
if(judge(mid)) {
l=mid;
} else {
r=mid;
}
}
printf("%.2lf\n",mid);
}
return 0;
}