POJ T1064 Cable master
题解:
题意是给出N条电缆,从中切出K条长度相同的电缆,求K条电缆每条最长是多长?
可以套用二分搜索求解最优解的模型(这个博客)
设L = 0,R = INF
本题还得注意精度,直接开double吧,省点心。
这里输出可用int强制转换,但要记得把除数改成100.0,你懂得。
而且本题需要设置合理的条件来满足精度的要求。代码中循环100次,每次循环区间范围缩小一半,最终可以达到以上的精度范围,对本题是完全足够的。
另一种方法是设置最小值eps,但是如果eps取得太小了,就有可能因为浮点数精度的原因陷入死循环,所以用这种方法要千万小心。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 10005;
double len[MAXN];
int n,k;
bool cut(double x){
int sum = 0;
for(int i = 0; i < n; ++i)
sum += (int)(len[i]/x);
return sum >= k;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i = 0; i < n; ++i)
scanf("%lf",&len[i]);
double L = 0,R = INF;
for(int i = 1; i < 100; ++i){
double mid = (L+R)/2; //不断缩小范围
if(cut(mid)) L = mid;
else R = mid;
}
printf("%.2lf\n",floor(R*100)/100);
}
return 0 ;
}