Codeforces Round #514 (Div. 2) D. Nature Reserve
阿新 • • 發佈:2018-10-14
nbsp clas eight -a -i 實測 bool 分享圖片 一個
http://codeforces.com/contest/1059/problem/D
最大值:
最左下方和最右下方分別有一個點
r^2 - (r-1)^2 = (10^7)^2
maxr<0.5*10^14
Way1:
二分。
difference:
如果使用 5*10^13 -> 10^-6,2^ 60~70區間,pow,sqrt運算,實測超時。
實際上是,使用。
time of a case:->
Code:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 5double x[maxn],y[maxn]; 6 double z=5.0*1e13; 7 int n; 8 9 bool work(double m) 10 { 11 double p,q,d; 12 int i; 13 p=-z; q=z; 14 for (i=1;i<=n;i++) 15 { 16 d=sqrt(pow(m,2)-pow(m-y[i],2)); 17 p=max(p,x[i]-d); 18 q=min(q,x[i]+d); 19 // if (p>q)20 // return 0; 21 } 22 // return 1; 23 if (p<=q) 24 return 1; 25 else 26 return 0; 27 } 28 29 int main() 30 { 31 double l=0,r,m; 32 int v,i; 33 scanf("%d",&n); 34 v=0; 35 for (i=1;i<=n;i++) 36 { 37 scanf("%lf%lf",&x[i],&y[i]);38 if (y[i]!=0) 39 { 40 if (v==0) 41 v=(y[i]>0); 42 else if (v!=(y[i]>0)) 43 { 44 printf("-1"); 45 return 0; 46 } 47 } 48 y[i]=fabs(y[i]); 49 l=max(l,y[i]/2); 50 } 51 r=z; 52 while ((r-l)/max(1.0,l)>1e-6) 53 { 54 m=(l+r)/2; 55 if (work(m)) 56 r=m; 57 else 58 l=m; 59 } 60 printf("%.10f",r); 61 return 0; 62 }
Way2:
多個二次函數f1,f2,…,fn,
f(x)=max(f1(x),f2(x),…,fn(x)),
而f是先減小,後增大,使用三分法
類似:
hdu4717 The Moving Points
Codeforces Round #514 (Div. 2) D. Nature Reserve