您的位置:首页 > 其它

poj 1064 Cable master

2013-10-16 16:43 330 查看
链接:http://poj.org/problem?id=1064

大致题意:有N条(cable),和它们各自的长度,把它们分割成K条长度相同的小绳子,每段最长可以为多少。

 

 

枚举,但是以0.001的单位增加必然超时,可以用二分查找来加快枚举

 

需要注意的是:精度,用地板函数来防止进位

 

 

 

#include<iostream>
using namespace std;
#define maxn 10000+5
int n,k;
double len[maxn];
bool j(double h)
{
int sum=0;
for(int a=0;a<n;a++)
{
sum=sum+(int)(len[a]/h);
}
if(sum>=k)//错点:一开始写的是sum==k......
return true;
return false;
}
double floor(double a)
{
int b=a;
return (double)b;
}
int main()
{
int a;
double l,r,mid,inf;
while(scanf("%d%d",&n,&k)!=EOF)
{
inf=0;
for(a=0;a<n;a++)
{
scanf("%lf",&len[a]);
if(inf<len[a]) inf=len[a];
}
l=0,r=inf;
for(a=0;a<50;a++)//枚举最长长度,可加大二分的次数,使结果更精确
{
mid=(r+l)/2;
if(j(mid)) l=mid;
else r=mid;
}
printf("%.2lf\n",floor(r*100)/100);//防止进位,二分次数够的话r或者l都行
}
return 0;
}


 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分