浮点二分与整数二分有几分不同,首先是while循环上,浮点二分的while循环,循环条件时while(r-l>=esp)。
其中esp是精度,mid=(r+l)/2。。。 r 和 l 移动的方式也不一样,l=mid,使mid增大,r=mid,使mid减小。
即code:
while(r-l>=esp){ double mid=(r+l)/2; if(check(mid)){ l=mid; ans=mid; } else r=mid; }
例题:
poj3122
注意输入用%lf,输出用%f.
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const double PI=3.14159265359; const int N=1E4+7; double arr[N]; double esp=1e-5; int n,f;//n个蛋糕,分成f份。 int check(double x){ int sum=0; for(int i=1;i<=n;i++){ sum+=int (arr[i]/x); } if(sum>=f) return 1; return 0; } void solve(){ scanf("%d%d",&n,&f); f++; double c=N; double r=0; for(int i=1;i<=n;i++){ scanf("%lf",&arr[i]); arr[i]=arr[i]*arr[i]; r+=arr[i]; } double l=0,ans=0; while(r-l>=esp){ double mid=(r+l)/2; int c=check(mid); if(c==1){ l=mid; ans=mid; } else r=mid; } printf("%.4f ",ans*PI); } int main() { int t; scanf("%d",&t); while(t--) solve(); return 0; }
https://ac.nowcoder.com/acm/contest/3006/B
牛客网 牛牛战队的比赛战地
浮点二分,但是check函数判断的条件不太懂,为什么当x1是所有点中最远的那个距离时,所有点产生的集合要有交集?算了,记下来吧。
#include<bits/stdc++.h> using namespace std; const double esp=1e-6; const int N=1E5+7; double x[N],y[N]; int n; bool check(double x1){ double l=-1e6,r=1e6; for(int i=1;i<=n;i++){ l=max(l,x[i]-sqrt(x1*x1-y[i]*y[i])); r=min(r,x[i]+sqrt(x1*x1-y[i]*y[i])); } return l<=r; } int main(){ cin>>n; double l=0,r=100000000,mid,ans=0; for(int i=1;i<=n;i++){ cin>>x[i]>>y[i]; l=max(l,abs(y[i])); } while(r-l>=esp){ mid=(r+l)/2; if(check(mid)) r=mid; else l=mid; } printf("%.4lf ",l); return 0; }