AcWing 680. java 一行一注释
原题链接
简单
作者:
季之秋
,
2021-01-16 15:51:16
,
所有人可见
,
阅读 330
一行一注释
import java.util.*;
public class Main{
static int n,m,N=100010;
static int w[]=new int[N];//线条长度
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
for(int i=0;i<n;i++){
w[i]=sc.nextInt();
}
double l=0,r=1e9; //二分求解 先定义边界
while(r-l>1e-4){//当无限接近0的范围就结束循环
double mid=(l+r)/2;//取中间值
if(check(mid)) l=mid;//判断是不是满足条件,因为要最大值,所以我们缩边界
else r=mid;
}
System.out.printf("%.2f",r);//输出保留两位小数的r或l都可以
}
static boolean check(double x){//判断是不是满足条件
int ref=0;
for(int i=0;i<n;i++){
ref+=w[i]/x;//用x长度可以剪多少根绳子
}
return ref>=m;//如果大于m根就代表x--r是可取的,如果不大于就代表x--r不可取
}
}