题目来源:http://poj.org/problem?id=1064
题目大意:有N条电缆,长度各不相同。如果从他们中切割出K条长度相同的电缆,求这K条电缆每条最长能有多长?(答案保留小数点后两位,规定1米的电缆最多可以切割成100份,即最小的切割单位是厘米)。
题目分析:该题目为一个典型的二分查找问题,与POJ3122的解题思路很相似,因此在这里不在赘述。该问题需要注意的是对计算精度的保证。
代码实现如下:
/*
* Copyright: (c) 2019
*
* 文件名称: ACM1064.cpp
* 文件标识:
* 摘 要:
*
* 版 本: 1.0
* 作 者: RF_LYF
* 创建日期: 2019/4/24 21:13
*/
#include <stdio.h>
#include <math.h>
int stockNum;
int needNum;
double cable[10001];
bool Check(double mid)
{
int nCount = 0;
for(int i = 0; i < stockNum; ++i)
{
if(cable[i] >= mid)
nCount += (int)(cable[i]/mid);
}
return nCount >= needNum;
}
int main()
{
while(scanf("%d%d", &stockNum, &needNum) != EOF)
{
for(int i = 0; i < stockNum; ++i)
{
scanf("%lf", &cable[i]);//注意double型变量的输入格式为lf,如果为f时读入会出问题
}
double low = 0.0;
double high = 100000;//为了提高计算效率,不再找所有电缆中的最大值,这里直接使用规定的电缆上限
double mid = 0;
while(high - low > 1E-3)//注意精度
{
mid = low + (high - low) / 2;
if(Check(mid))
low = mid;
else
high = mid;
}
printf("%.2lf\n", floor(high*100)/100);//floor的应用保证取下限,进而避免自动进位的问题
}
return 0;
}