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

版权声明:希望能帮到弱校的ACMer成长,因为自己是弱校菜鸡~~~~ https://blog.csdn.net/Mr__Charles/article/details/82871237

                               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 ;
} 

猜你喜欢

转载自blog.csdn.net/Mr__Charles/article/details/82871237
今日推荐