描述
窗外肉价飞涨,屋里灶台微响。便当店老板在沉思中苦恼:
现在店里的存货还有n条特制香肠,长度分别为Li 。如果能从它们中切割出k条长度相同的香肠的话,就能应付突如其来的奇怪的订单
你能帮这位老板计算一下这k条香肠每条最长能有多长吗?
(答案保留小数点后两位,规定1单位长度的香肠最多可以切割成100份)
输入
第一行输入2个正整数n,k
第2−(n+1)行每行输入一个实数L(1.0≤Li≤1.0 * 10^5)
输出
输出切出来的香肠的最大长度,结果保留两位小数
样例
输入复制
4 11
8.02
7.43
4.57
5.39
输出复制
2.00
提示
数据规模
对于10%10%的数据,0≤n≤10,1≤k≤100≤n≤10,1≤k≤10
对于20%20%的数据,0≤n≤100,1≤k≤1000≤n≤100,1≤k≤100
对于40%40%的数据,0≤n≤1000,1≤k≤10000≤n≤1000,1≤k≤1000
对于100%100%的数据,0≤n≤10000,1≤k≤100000≤n≤10000,1≤k≤10000
思路:典型的二分(洛谷有一道切绳子,和本题一模一样),本题要求保留两位小数,如果直接用double计算会造成误差,所以我们可以先将浮点数乘以100倍,以整数的形式储存、计算。最后输出结果时只需除以100,以浮点数的形式输出即可。
代码:
#include <stdio.h>
double p;
long long n,k,t,t1,a[100005],max,min,mid;
int ok(long long x)
{
t=0;
for(int i=0;i<n;i++)
{
t1=(a[i]/x);
t+=t1;
}
if(t<k) return 0;
return 1;
}
int main()
{
scanf("%lld%lld",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%lf",&p);
a[i]=100*p;
}
min=1;
max=10000000;
while(min<max)
{
mid=(min+max)/2;
if(ok(mid))
{
min=mid+1;
}
else
{
max=mid;
}
}
printf("%.2lf",1.0*(min-1)/100);
return 0;
}