Codeforces Round #514 (Div. 2) D. Nature Reserve
Posted cmyg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #514 (Div. 2) D. Nature Reserve相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #514 (Div. 2) D. Nature Reserve
Codeforces Round #514 (Div. 2) C. Sequence Transformation(递归)
Codeforces Round #514 (Div. 2) C. Sequence Transformation 思维构造
Codeforces Round #436 E. Fire(背包dp+输出路径)