1. 程式人生 > >Codeforces Round #514 (Div. 2) D. Nature Reserve

Codeforces Round #514 (Div. 2) D. Nature Reserve

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 
 5
double 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