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