直接二分答案,区间的l取0、r取长度和,然后check时对每条长度除以二分的值向下取整,判断是否不小于k就行了。
基本是转换成整型进行二分,这里直接对实型进行二分,然后输出时稍微处理就行了。
#include<bits/stdc++.h>
using namespace std;
int n,k;
double a[10005],l,r,mid;
char s[100];
inline bool check(double x)
{
int tot=0;
for(int i=1;i<=n;i++)tot+=floor(a[i]/x);
return tot>=k;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%lf",&a[i]),r+=a[i];
while(r-l>1e-4)
{
mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}
sprintf(s+1,"%.3f",l);
s[strlen(s+1)]='\0';
printf("%s",s+1);
return 0;
}
标签:二分,int,double,绳子,mid,就行了,check
From: https://www.cnblogs.com/wangjunlong9948/p/16614339.html