链接:http://poj.org/problem?id=1064
有N根电缆,要求剪成K断,要求这K段长度都相等。求最大所能减的长度。
看起来很简单的一个二分,但是花了好久才过,而且看了很多别人的代码。
具体见代码的注解吧。。。。
郁闷啊。。。
#include<cstdio>
#include<cmath>
#define MAXN 10005
double cable[MAXN];
int main()
{
int n,k,i,ans,res;
double max;
int high,low,mid;
while(scanf("%d%d",&n,&k)!=EOF)
{
max=0;
for(i=0;i<n;i++)
{
scanf("%lf",&cable[i]);
cable[i]=100*(cable[i]+0.005);//加0.005为了四舍五入,据说这样才能过
//另外将cable扩大100倍,取整来做
//当然用double也是能过的,只是我真没写出来
if(max<cable[i])
max=cable[i];
}
high=(int)max;//上界取所有cable中的最大值
low=1; //下界要从1开始啊,从0开始就错。
//考虑到每次cut的长度至少为1cm
mid=0;
res=0;
while(low<=high)
{
ans=0;
mid=(high+low)/2;
for(i=0;i<n;i++)
{
ans+=(int)(cable[i]/mid);
}
if(ans>=k)
low=mid+1;
if(ans<k)
high=mid-1;
}
printf("%.2lf\n",high/100.0);//取high我就不知道为什么了,平时都是取mid的啊
//难道和上面加了0.005有关?这个还不清楚啊
}
return 0;
}