Description
The New Vasjuki village is stretched along the motorway and that's why every house on it is characterized by its shift relative to some fixed point — the xi coordinate. The village consists of n houses, the i-th house is located in the point with coordinates of xi.
TELE3, a cellular communication provider planned to locate three base stations so as to provide every house in the village with cellular communication. The base station having power d located in the point t provides with communication all the houses on the segment[t - d, t + d] (including boundaries).
To simplify the integration (and simply not to mix anything up) all the three stations are planned to possess the equal power of d. Which minimal value of d is enough to provide all the houses in the village with cellular communication.
Input
The first line contains an integer n (1 ≤ n ≤ 2· 105) which represents the number of houses in the village. The second line contains the coordinates of houses — the sequence x1, x2, ..., xn of integer numbers (1 ≤ xi ≤ 109). It is possible that two or more houses are located on one point. The coordinates are given in a arbitrary order.
Output
Print the required minimal power d. In the second line print three numbers — the possible coordinates of the base stations' location. Print the coordinates with 6 digits after the decimal point. The positions of the stations can be any from 0 to 2· 109 inclusively. It is accepted for the base stations to have matching coordinates. If there are many solutions, print any of them.
Sample Input
41 2 3 4
0.5000001.500000 2.500000 3.500000
310 20 30
010.000000 20.000000 30.000000
510003 10004 10001 10002 1
0.5000001.000000 10001.500000 10003.500000
本题有两种思路:一种,枚举三段,找最小,然后优化,第二种,使用二分距离判断是否符合条件。本题有个隐藏条件,那就最终的距离只可能是前面一个整数,后面跟个0.5或0.
#include二分代码#include #include #include using namespace std;const int mm=2e5+9;const int oo=1e9;int dis[mm];int n;double a,b,c,len=oo;void ok(int x,int y){ if(y<0)y=0; int z; z=dis[x]-dis[0]; z=max(dis[y]-dis[min(x+1,n-1)],z); z=max(dis[n-1]-dis[min(y+1,n-1)],z); if(z dis[j]-dis[i+1]) ++j; ok(i,j);ok(i,j-1); } len/=2.0;a/=2.0;b/=2.0;c/=2.0; printf("%.6lf\n%.6lf %.6lf %.6lf\n",len,a,b,c);}
#include#include #include #include using namespace std;const int mm=2e5+9;const double oo=1e39;const double ex=1e-7;double locat[mm];int n,ans[mm];int blook(int x)///返回比x大的第一个数的下标{ int l=0,r=n,mid=(l+r)/2; while(l x)r=mid; else l=mid+1; mid=(l+r)/2; } return mid;}bool ok(int x){ int z=0; for(int i=0;i<3;i++) { z=blook(locat[z]+x); ans[i]=z; if(z==n)return 1; } return 0;}int main(){ while(cin>>n) { for(int i=0;i >locat[i]; sort(locat,locat+n); int r=2e9+9,l=0,mid; while(l