AC代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 100010;
int n,m;
int arr[N];
bool check(double mid){ ///判断此结果是否符合要求
int cnt=0;
for(int i=0;i<n;++i)
cnt+=(int)arr[i]/mid;
if(cnt>=m)
return true;
else
return false;
}
int main(){
cin>>n>>m;
for(int i =0;i<n;++i)
cin>>arr[i];
double l=0,r=1e9,mid; ///左右端点
while(r-l>1e-4){
mid=(l+r)/2;
if(check(mid)) ///若中点满足要求,则从右段找最优解
l=mid;
else ///否则从左段找最优解
r=mid;
}
printf("%.2f\n",mid);
return 0;
}
思路
- 直接解很难,而把问题转化为在答案范围内找解,看是否能符合要求则容易实现
- 找解采用二分查找:能用二分的条件,不管答案在哪,每次二分不影响查找
- 浮点二分的精度问题:
方法一:r - l <= 1e-k+2 (k为小数保留位数)
while (r - l > 1e-4)
方法二:1e7 / check()函数时间复杂度 (循环固定次数)
for (int i = 0; i < 100; i++)
同类题型
AcWing 790. 数的三次方根
整数二分