Miaomiao's geometrytime limit: 2000/1000 MS (Java/others) memory limit: 65536/65536 K (Java/Others)
Total submission (s): 363 accepted submission (s): 92
Problem descriptionthere are n point on X-axis. miaomiao wowould like to cover them all by using segments with same length.
There are 2 limits:
1. A point is convered if there is a segments t, the point is the left end or the right end of T.
2. The length of the intersection of any two segments equals zero.
For example, point 2 is convered by [2, 4] and not convered by [1, 3]. [1, 2] and [2, 3] are legal segments, [1, 2] and [3, 4] are legal segments, but [1, 3] and [2, 4] are not (the length of intersection doesn't equals zero), [1, 3] and [3, 4] are not (not the same length ).
Miaomiao wants to maximum the length of segements, please tell her the maximum length of segments.
For your information, the point can't coincidently at the same position.
Inputthere are several test cases.
There is a number T (t <= 50) on the first line which shows the number of test cases.
For each test cases, there is a number N (3 <= n <= 50) on the first line.
On the second line, there are n integers AI (-1e9 <= AI <= 1e9) shows the position of each point.
Outputfor each test cases, output a real number shows the answser. Please output three digit after the decimal point.
Sample Input
331 2 331 2 441 9 100 10
Sample output
1.0002.0008.000HintFor the first sample , a legal answer is [1,2] [2,3] so the length is 1.For the second sample , a legal answer is [-1,1] [2,4] so the answer is 2.For the thired sample , a legal answer is [-7,1] , [1,9] , [10,18] , [100,108] so the answer is 8.
Sourcebestcoder round #4 solutions:
The game was played in two parts, and was later hack ..
Incorrect binary result: for example, the following data set:
4
0 1 4 5
The maximum length of all possible line segments can be two conditions (the distance between two adjacent points and half the distance between two adjacent points ). Why is it the largest? It is no problem if it is half the distance between two adjacent points.
Therefore, we store the interval distance and half of the distance between all adjacent points in the array, sort from small to large, and reverse traverse. Each traversal of a number determines whether it meets the meaning of the question, if yes, exit and get the answer. How can we determine whether the question is correct?
With greedy ideas, you can put them on the left, and right.
Note that this question does not limit the number of line segments, but only requires the maximum length of the Line Segment. I think this condition plays a key role in greed.
Code:
# Include <iostream> # include <stdio. h> # include <string. h >#include <queue> # include <stack> # include <algorithm> # include <cmath> # include <iomanip> using namespace STD; int num [60]; double inter [120]; // interval, which contains the interval distance between two adjacent points and half of the interval distance. Const int EPS = 1e-6; int N; bool OK (double L) {double temp = num [1]; for (INT I = 2; I <= n-1; I ++) {If (temp = num [I]) // when the last and second vertices are overwritten, you do not need to calculate the following TEP = num [I] + L if (temp> num [I + 1]). the last vertex is the free continue; If (Num [I]-l> = temp) temp = num [I]; else {temp = num [I] + L; if (temp> num [I + 1]) return false ;}} return true ;}int main () {int t; CIN >>t; while (t --) {scanf ("% d", & N); For (INT I = 1; I <= N; I ++) scanf ("% d ", & num [I]); sort (Num + 1, num + 1 + n); int CNT = 0; For (INT I = 1; I <= N; I ++) {inter [CNT ++] = num [I]-num [I-1]; Inter [CNT ++] = (Num [I]-num [I-1]) /2.0;} Sort (Inter, Inter + CNT); double ans = 0; For (INT I = cnt-1; I> = 0; I --) {If (OK (Inter [I]) {ans = Inter [I]; break ;}} cout <setiosflags (IOs: fixed) <setprecision (3) <ans <Endl;} return 0 ;}