切香肠 (浮点数 二分)

描述
窗外肉价飞涨,屋里灶台微响。便当店老板在沉思中苦恼:
现在店里的存货还有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;
}
原文地址:https://www.cnblogs.com/fxzemmm/p/14847997.html