有 nn 条绳子,它们的长度分别为 L_iL
i
,如果从它们中切割出 mm 条长度相同的绳子,这 mm 条绳子每条最长能有多长?
输入格式
第一行两个整数 nn 和 mm。
接下来 nn 行,每行一个实数,描述了每条绳子的长度 L_iL
i
。
数据范围:1\le n\le m\le 10^41≤n≤m≤10
4
,1\le L_i \le 10^51≤L
i
≤10
5
。
输出格式
切割后每条绳子的最大长度,答案向下保留到小数点后 22 位。
输出时每行末尾的多余空格,不影响答案正确性
样例输入复制
4 11
8.02
7.43
4.57
5.39
样例输出复制
2.00
这一题可以看出是利用二分,可是有精度控制,最开始我写的时候使用的是double,然后利用right-left>=0.001来控制,可是始终有几个例子过不了,后来看了大神的,将每个数据扩大100倍,然后按照正常的rleft<=right即可,所以,代码如下:
//@author:hairu,wu
//@from:ahut
#include<iostream>
#include<iomanip>
using namespace std;
int n,m;
double h[10010];
bool check_2(int x){
int ans=0;
for(int i=0;i<n;i++){
ans+=(int)(h[i]/x);
}
return ans>=m;
}
int main(){
cin >> n>>m;
int left=0,right=0;
for(int i=0;i<n;i++){
cin >> h[i];
h[i]*=100;
if(h[i]>right) right=h[i];
}
int ans=0;
while(left<=right){
int mid=(left+right)/2;
if(check_2(mid)){
ans=mid;
left=mid+1;
}else{
right=mid-1;
}
}
printf("%.2lf",ans*1.0/100);
return 0;
}