题目
题解思路
我们可以得到答案的区间 0 到薯条平均长度 。
直接取上界为INF,下界为0进行二分枚举答案。
我们让二分进行100次,可以让答案精确到10的负30次方,所以上界不需要那么精确都行。
输出有点坑,不能四舍五入。
用floor函数先乘100将那两位数提出然后抹去小数位,然后除回去。
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
double a[11000];
int n,k;
const int INF = 0x3f3f3f3f;
bool che(double p)
{
int cnt = 0 ;
for (int i = 1 ; i <= n ; i++ )
{
cnt += (int)(a[i]/p);
}
if ( cnt >= k )
return 1;
else
return 0;
}
int main ()
{
double sum = 0 ;
scanf("%d%d",&n,&k);
for (int i = 1 ; i <= n ; i++ )
{
scanf("%lf",&a[i]);
sum += a[i];
}
sort(a+1,a+n+1);
double t1 = 0 ,t2 = INF ,mid ;
for (int i = 1 ; i <= 100 ; i++ )
{
mid = (t1+t2)/2;
if (che(mid))
{
t1 = mid;
}else
{
t2 = mid;
}
}
printf("%.2f\n",floor(t1*100)/100);
return 0;
}