1.题目:
2.点睛:
二分查找!
3.代码:
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m;
double a[N],mid;//mid记录左右边之和的二分的值;
int main()
{
scanf("%d%d",&n,&m);//以前用的cin,今天看了一本算法书说scanf,printf快一点,就改了一下;
for(int i=0;i<n;i++){
scanf("%lf",&a[i]);
}
sort(a,a+n);//给绳子的长度从大到小排列
double left=0;//左边从0开始
double right=a[n-1];//右边从最大值开始
while(right-left>0.0001){//判断条件为题目要保留2位小数的后两位(为什么不是0.01呢?本人认为
//应该是因为要四舍五入),防止程序一直循环;
mid=(left+right)/2;//左右边二分的计算
int ans=0;//记录二分之后能分出几段等长的绳子;
for(int j=0;j<n;j++){
ans+=(a[j]/mid);//计算每一段绳子能剪成几段长度为mid的绳子,然后求总和与m比较;
}
if(ans<m){//剪成长度为mid的绳子总数小于要求的m段;继续二分;
right=mid;
}
else{//剪成长度为mid的绳子总数大于或等于要求的m段;
left=mid;
}
//当满足while条件时就是我们要的答案
}
printf("%.2lf",mid);//输出left也可
return 0;
}
还需继续理解二分,不太会用!!