POJ - 1064 二分

输入2个数 n    k

n条绳子    要分成大于等于k段

求每段最长多长呢?并且每段不能小于1cm

必须以厘米精度写入数字,小数点后正好是两位数。
如果无法切割所请求的每个长度至少为1厘米的件数,则输出文件必须包含单个数字“0.00”(不带引号)。

Sample Input

4 11
8.02
7.43
4.57
5.39

Sample Output

2.00

4条绳子  分成大于等于11段

用二分的方法分(需要注意的是,分的绳子的长度不一定是最短的那条绳子,也就是不需要每条绳子都裁剪)

比如4条绳子    分2段

上面的题的答案就是7.00

而且 这个输出是个坑点,不需要进,我看其他大佬的方法是,输入时先*100输出的时候/100就能解决这个输出问题

扫描二维码关注公众号,回复: 2903557 查看本文章

上代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define N 10010
#define MAX 10000000
int a[N];
 
int main(){
	int n ,m;
	double len;
	while (scanf("%d%d",&n,&m)!=EOF){
		int Max=0;
		for(int i=0;i<n;i++)
		{
			scanf("%lf",&len);
			a[i]=len*100;
			Max=max(Max,a[i]);
		}
		int low=1,high=Max;//1厘米 
		int res=0;
		while(low<=high)
		{
			int mid =(low+high)>>1;//值右移1位,相当l+r的值除以2取整。 
			int count =0;
			for(int i=0;i<n;i++)
			{
				count+=a[i]/mid;//每根绳子能剪成几段 
			}
			if(count>=m)//如果大于等于需要剪的个数则,让 
			res=max(res,mid),low=mid+1;//因为要找最长的线段所以需要max函数比较 
			else
			high=mid-1;
		}
		printf("%.2f\n",(double)res/100.0);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Harington/article/details/82011520
今日推荐