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

猜你喜欢

转载自www.cnblogs.com/cmyg/p/9784683.html
今日推荐