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就能解决这个输出问题

上代码


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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值