洛谷P1577 切绳子
实数二分,精度可能缺失,解决办法是先把每根绳子长度a[i]乘以100化为整数,再按整数的方法二分,最后输出答案时再除以100即可。
注意在二分过程中要特判m=0的情况,否则在judge函数中会除以0导致RE,解决办法是二分前先初始化ans=0,若出现了m=0则退出二分循环,输出答案ans=0.00。
#include <bits/stdc++.h>
using namespace std;
int n,k,i,l,r,m;
double s,ans,a[10010];
bool judge(int m)
{
s=0;
for(i=1;i<=n;i++)
s=s+(int)(a[i])/m;//m!=0才可使用judge函数判断
return s>=k;
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>k)
{
for(i=1;i<=n;i++)
{cin>>a[i];a[i]=a[i]*100;}
l=0,r=10000000;
ans=0;
while(l<=r)
{
m=l+(r-l)/2;
if(m==0)break;//n=1 k=10000 a[1]=1.00时,二分过程中会出现m=0的情况,在judge函数中会除以0导致RE
//要防止RE,先初始化ans=0,如果二分过程中m=0直接break退出二分,输出答案ans=0.00
if(judge(m))ans=m,l=m+1;
else r=m-1;
}
printf("%.2lf\n",ans/100);
}
return 0;
}