P1577 切绳子
二分法解决此问题
代码如下
#include<bits/stdc++.h>
using namespace std;
double n,k;
double a[100001];
char s[100];
bool check(double x) {
int cnt=0;
for(int i=1; i<=n; i++) {
cnt+=(int)(a[i]/x);
}
return cnt>=k;
}
int main() {
cin>>n>>k;
double r=0,l=0;
for(int i=1; i<=n; i++) {
cin>>a[i];
r+=a[i];
}
while(r-l>0.0001) {
double mid=(r+l)/2;
if(mid==0)
break;
if(check(mid))//二分,以mid作为最大长度,然后由check函数进行检验,如果题目给出n条绳子经过 cnt+=(int)(a[i]/x);计算后等于k条,为真
l=mid;//真,mid太小或者可能性刚刚好,往右边扩大范围
else
r=mid;//假,mid太大导致切割后绳子的数量不足k条,缩小范围
}
r=floor(r*100.0);
r/=100.0;
cout<<setiosflags(ios::fixed)<<setprecision(2)<<r;
//printf("%.2f\n",floor(r*100)/100);
}
最后输出结果如果把有边界r改为左边界l 会有精度丢失问题,会wa一个点 具体怎么解决我也不知道了,从右r进行输出就不会有这个问题.(/疑惑)