对于二分而言,如果判断条件比较简单的话,在求解最大化或者最小化问题的时候就比较适用
但是这道题目吖的卡精度。。
#include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> using namespace std; const double inf=200005.5;// 这个最大值千万不要用define。。。 进度坑死人 int n,k; double a[10001]; bool judge(double x) { int num=0; for(int i=1; i<=n; i++) { num+=(int)(a[i]/x); } return num>=k; } int main() { while(scanf("%d %d",&n,&k)!=-1) { for(int i=1; i<=n; i++) scanf("%lf",&a[i]); double l=0,r=inf; for(int i=1; i<=100; i++)// 这里是学习书上的一种操作了,多次循环来控制进度 { double mid=(l+r)/2; if(judge(mid)) l=mid;//切多了 else r=mid; } printf("%.2f ",floor(r*100)/100);// 这里一定要注意要向下取整 如果向上取整的话就满足不了条件了 } return 0; }