#include <stdio.h> #include <cstring> #include <cstdlib> #include <algorithm> #include <cmath> using namespace std; #define MAXN 10003 double a[MAXN]; int k,n; int C(double x) { int i,tot=0; for(i=0;i<n;i++) { tot+=(int)(a[i]/x); } //if(tot>=k)return 1; //else return 0; return tot>=k; } int main() { int i; double mmax,d,u; while(scanf("%d%d",&n,&k)!=EOF) { mmax=-1; for(i=0;i<n;i++) { scanf("%lf",&a[i]); mmax=max(mmax,a[i]); } d=0;u=mmax; for(i=0;i<100;i++) { if(C(mmax))d=mmax; else u=mmax; mmax=(d+u)/2; } printf("%.2lf\n",floor(u*100)/100); /*这个地方有个陷阱。2f是四舍五入的,所以floor(mmax*100)/100保证的只是舍而不入,比如你算出来的最大长度*/ } return 0; }
原文:http://blog.csdn.net/u011026968/article/details/19653477