二分
POJ1064
N条绳(边),长L[i],从中切k条等长绳,求绳长最大值,两位小数,1单位长度的绳子最多可以切割成100份
Sample Input
4 11
8.02
7.43
4.57
5.39
Sample Output
2.00
#include <bits/stdc++.h>
using namespace std;
const double inf=0x3f3f3f3f;//最大值
double L[10005]; //存每条边的长度
int n,k; //边数,需要切出的段数
bool check(double x){ //判断长度为X是否符合
int num=0; //开始切出0段
for(int i=0;i<n;i++) //扫一次
num+=(int)(L[i]/x); //每条边能切多少段
return num>=k; //切出的段数是否够K
}
void solve(){
double left=0,right=inf;//定义左右界
for(int i=0;i<100;i++){ //2^100~10^30
double mid=(left+right)/2; //均值
if(check(mid)) left=mid; //够K则二分长度变大
else right=mid; //不够K则二分长度变短
}
printf("%.2f\n",floor(right*100)/100);//最出两位小数
}
int main(){
while(scanf("%d%d",&n,&k)!=-1){ //N边,分K段
for(int i=0;i<n;i++)scanf("%lf",&L[i]);//输入边长
solve(); //求解
}
return 0;
}