题目大概:
给出n根长度不同的木棒,让我们切成长度相同的m根木棒,问切的木棒的最长长度是多少。
思路:
每根木棒的长度和根数成反比。
长度 l =0,,r为木棒总长度除m。mid=(l+r)/2.。
用二分法不断逼近最大的长度即可。
最后取右端点。
代码:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std
;
double l
,r
=0,mid
;
double sum
=0;
double a
[100600];
int main()
{int n
,m
,j
=0;
scanf("%d%d",&n
,&m
);
for(int i
=0;i
<n
;i
++)
{scanf("%lf",&a
[i
]);
sum
+=a
[i
];
}
sum
=sum
/(double)(m
);
l
=0;r
=sum
;
while(r
-l
>1e-10)
{mid
=(l
+r
)/2;
j
=0;
for(int i
=0;i
<n
;i
++)
{j
+=(int)(a
[i
]/mid
);
}
if(j
>=m
){l
=mid
;}
else r
=mid
;
}
printf("%.2f\n",r
=(int)(r
*100)/100.0);
return 0;
}