水题,可以熟悉下二分,附上java代码,需要注意的是最后要用floor函数保留两位小数,我还因此WA了几发QAQ
代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
static double[] l ;
static int n;
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while(in.nextToken() != StreamTokenizer.TT_EOF){
n = (int)in.nval;
in.nextToken();
int k = (int)in.nval;
l = new double[n];
for(int i = 0; i<n; i++){
in.nextToken();
l[i] = in.nval;
}
double left=0,right=100000;
for(int i = 0; i<100; i++){
double mid = (left+right)/2;
if(right(mid, k))
left = mid;
else right = mid;
}
DecimalFormat df = new DecimalFormat("0.00");
right = Math.floor(right*100)/100;
if(right(right, k)) out.println(df.format(right));
else out.println("0.00");
out.flush();
}
}
private static boolean right(double mid, int k) {
int tem = 0;
for(int i = 0; i<n; i++){
tem += (int)(l[i]/mid);
}
//此处是tem>=k返回true
if(tem >= k) return true;
return false;
}
}