POJ T1064 Cable master(假定一个解并判断是否可行)

                               POJ T1064 Cable master


题解:

  题意是给出N条电缆,从中切出K条长度相同的电缆,求K条电缆每条最长是多长?

  可以套用二分搜索求解最优解的模型(这个博客

  设L = 0,R = INF

  本题还得注意精度,直接开double吧,省点心。

  这里输出可用int强制转换,但要记得把除数改成100.0,你懂得。

  而且本题需要设置合理的条件来满足精度的要求。代码中循环100次,每次循环区间范围缩小一半,最终可以达到10^{-30}以上的精度范围,对本题是完全足够的。

  另一种方法是设置最小值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 ;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值