3月27日
这个题目主要考的是分冶,也就是二分查找,我们根据条件来找到需要的最大的长度,在使用二分查找时,我们需要保证区间里面的数是有序的,我们定义left与right来决定需要查找的区间大小,根据题目需求,具体情况,具体做条件判断,我们写一个函数用来判断并且帮助缩小区间,定义一个bool的函数,输入值我们输入一个可能是最大的长度,对其求出来可以裁剪的数量,如果大于等于需的数量s,就返回1,否则就返回0,用来作为二分查找的判断条件,如果大于等于s,说明这个数小了(等于的情况放在一起,可以更好的处理,因为我们是需要找最大的长度),在右边的区间,我们就令left就等于mid,如果不满足,说明这个数大了,他在左边的区间里面,我们就令right等于mid,以此类推,直到right<left,但是这个题目精度要求比较高,所以就写成了right-left>1e-4,因为前面我们将等于的情况给了left,所以我们输出left就可以了,同时记得保留两位小数输出。
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int a[100010];
bool pd(double x)
{
int cnt=0;
for(int i=0;i<n;i++)
{
cnt+=(a[i]/x);
}
return cnt>=m;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
double mid,left=0,right=1e9;
while(right-left>1e-4)
{
mid=(left+right)/2;
if(pd(mid))
left=mid;
else
right=mid;
}
printf("%.2lf",left);
}