分割绳子

题目描述
现有N条绳子,它们的长度分别为L1,L2,„„,Ln,如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?

输入
共有两行,第一行包含两个正整数N和K,用一个空格分隔;第二行包含N个数,依次表示N条绳子的长度,两数间用一个空格分隔。每条绳子长度的小数不超过两位。(1<=N<=1000,1<=K<=1000,1<=Li<=10000)

输出
仅包含一个数,表示所得K绳子的最大长度。答案四舍五入保留小数点后两位。

样例输入
4 11
8.02 7.43 4.57 5.39
样例输出
2.00
本题的基本思路。我们可以运用二分查找法。我们可以用二分查找,查找到一个数,将其中每条绳子与之相除得到能剪成多少根绳子。算出总的绳子数。然后,比较判断。如果绳子数大于等于需要的绳子数,那么我们可以继续二分,不过将起点改成之前的中点(即上次的查找长度)。如果,绳子数小于需要的绳子数,我们继续二分,不过将其终点改成上次查找的中点。继续查找。

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
double a[1005];
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=0;i<n;i++){
		scanf("%lf",&a[i]);
	}
	double l=0.001,r=10000;
	for(int i=0;i<100;i++){
		double mid=(l+r)/2;
		int t=0;
		for(int j=0;j<n;j++)
			t+=(int)(a[j]/mid);
		if(t>=k) l=mid;
		else r=mid;
	}
	printf("%.2lf\n",l);
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/85303989
今日推荐