给出N条电缆,要求切出K段长度均为L 的电缆,要求L的最大值。可用二分法解决。一开始是用浮点数和下界函数来处理数据的,后来觉得在精度的控制上可能会出一些问题。受到同学的启发后,决定对每条电缆长 X 100作整数处理。代码使用递归实现。其中有一个需要注意的地方 : 针对笔者的代码,当mid = 0 的时候,只有一种情况:low = 1 , high = 0 这是其中一个没有解的出口,而这种情况在递归开始的第一条语句( low > high ) 时就被过滤掉了。所以不用担心后面会因为除零而RE。
codes:
#include <stdio.h>
#include <math.h>
int N,K,a[10001];
int total, bigg;
int solve(int low , int high ) {
if ( low > high )
return high;
int cnt = 0 , mid = (low+high)/2;
for ( int i = 1 ; i <= N ; i ++ )
cnt += a[i]/mid;
if ( cnt < K )
return solve(low,mid-1);
else
return solve(mid+1,high);
}
int main() {
scanf("%d%d",&N,&K);
total = bigg = 0;
double v;
for ( int i = 1 ; i <= N ; i ++ )
{
scanf("%lf",&v);
a[i] = int(v*100.0);
bigg = bigg < a[i] ? a[i] : bigg;
total += a[i];
}
printf("%.2f\n",solve(1,bigg)/100.0);
return 0;
}