您的位置:首页 > 其它

hdu 1551 Cable master(二分法)

2015-09-04 22:55 316 查看
原题链接:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: