切绳子

直接二分答案,区间的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; }
posted @ 2022-08-22 21:29  TheMagician  阅读(119)  评论(0)    收藏  举报