二分时候用while来枚举精度WA…
然后换了一种方法用while枚举就可以了,但mid,r,的floor取整都是错的
但换成 l 就对了…
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
const int N=1e6+10;
double a[N],maxn;
int n,k;
int is(double x)
{
int sum=0;
for(int i=0;i<n;i++)
{
sum+=(int)(a[i]/x);
}
if(sum>=k)
return 1;
return 0;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
maxn=max(maxn,a[i]);
}
double r=0,l=maxn,mid;
for(int i=0;i<=100;i++)//循环二分
{
mid=(l+r)/2;
if(is(mid))
{
r=mid;
}
else
{
l=mid;
}
}
mid=(l+r)/2;
int temp=mid*100;//保留小数
printf("%.2f\n",temp*0.01);
}