白皮书的二分
题意:有n条绳子,他们的长度分别为li,从他们中切个出k条长度相同的绳子的话,这k条绳子每条最长能有多长?保留小数点后两位
分析:二分
#include<cstdio> #include<cstring> #include<cmath> #define maxn 10010 #define INF 100001 double a[maxn]; int n,k; bool dix(double x) { int num=0,i; for(i=0;i<n;++i) num+=(int)(a[i]/x); return num>=k;//满足条件是返回true,不满足返回false } int main() { while(scanf("%d%d",&n,&k)!=EOF) { int i; for(i=0;i<n;++i) scanf("%lf",&a[i]); double left=0,right=INF,mid; i=1000; while(i--) { mid=(left+right)/2; if(dix(mid)) left=mid; else right=mid; } printf("%0.2f ",floor(right*100)/100);//注意精度,可不明白%0.2lf输出为什么会错 } return 0; }