POJ - 1064-Cable master-(二分,精度控制)
题目链接:https://cn.vjudge.net/problem/POJ-1064
题目大意:
一共有n跟绳子,有M个装置,给M个装置分配等长的绳子,问最长可以截到多长。
题目分析:
本质上这就是一个二分题,不断二分可能的长度,判断该长度符合不符合条件,大概二分一百遍就能达到题目要求的精度。
不过这个题训练的时候写爆炸了,卡在了精度的问题上,最后输出结果的时候应该先乘一百然后取整数部分再除一百来控制精度,因为小数点后面的精度很麻烦。
给出代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
double len[10010];
int n,m;
bool solve(double x)
{
int sum=0;
for(int i=0;i<n;i++)
{
sum+=(int)(len[i]/x);
if(sum>=m)
break;
}
return sum>=m;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>len[i];
}
double l=0,r=100000+10;
for(int i=0;i<100;i++)
{
double mid=(l+r)/2;
if(solve(mid))
l=mid;
else
r=mid;
}
printf("%.2lf\n",floor(l*100)/100);
return 0;
}