原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1551
题目大意:
N个电缆,均分成K份。
问每份最长为多少。
思路:
求出总长度,总长度/K即每份最大值,然后与0开始二分,直到找到能分成K份的最大值。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
const int MAXN = 10000 + 10;
double cable[MAXN];
int main()
{
int N, K;
while (scanf("%d%d",&N,&K)&&(N+K))
{
double right = 0;
for (int i = 0; i < N; i++)
{
scanf("%lf", &cable[i]);
right += cable[i];
}
right /= K;
double left = 0, mid, ans = 0;
while (abs(right - left)>0.001)//题目要求保留两位小数,所以算到第三位
{
int sum = 0;
mid = (left + right) / 2;
for (int i = 0; i < N; i++)
{
sum += floor(cable[i] / mid);//向下取整。
}
if (sum<K)
right = mid;
else left = mid;
if (sum == K&&ans < mid)
ans = mid;
}
printf("%.2lf\n",ans);
}
return 0;
}