二分 例题3

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Description

There are N point on X-axis . Miaomiao would 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.
 

Input

There 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.
 

Output

For each test cases , output a real number shows the answser. Please output three digit after the decimal point.
 

Sample Input

3 3 1 2 3 3 1 2 4 4 1 9 100 10
 

Sample Output

1.000 2.000 8.000

Hint

For 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. 
代码:
为什么要加后面那一段再判一下呢?删掉就错了呢?为什么呢?我也不知道啊,是吧?
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const double inf=1e9+7;
 8 
 9 int n;
10 double a[56];
11 
12 bool C(double x)
13 {
14     int i;
15     double ab=a[1];
16     for(i=2;i<n;i++)
17     {
18         if(a[i]-ab>=x)
19         {
20             ab=a[i];
21         }
22         else
23         {
24             if(a[i+1]-a[i]<x)
25                 return false;
26             else if(a[i+1]-a[i]==x)
27             {
28                 ab=a[i+1];
29                 i++;
30             }
31             else if(a[i+1]-a[i]>x)
32             {
33                 ab=a[i]+x;
34             }
35         }
36     }
37     return true;
38 }
39 
40 int main()
41 {
42     int T;
43     int i,j;
44     scanf("%d",&T);
45     while(T--)
46     {
47         scanf("%d",&n);
48         for(i=1;i<=n;i++)
49             scanf("%lf",&a[i]);
50         sort(a+1,a+n+1);
51         double lb=0,ub=inf;
52         for(i=1;i<=100;i++)
53         {
54             double mid=(lb+ub)/2.0;
55             if(C(mid))
56                 lb=mid;
57             else
58                 ub=mid;
59         }
60         for(i=1;i<n;i++)
61             if(C(a[i+1]-a[i]) && (a[i+1]-a[i])>lb)
62                 lb=a[i+1]-a[i];
63         printf("%.3lf
",lb);
64     }
65     return 0;
66 }
View Code
原文地址:https://www.cnblogs.com/cyd308/p/4693664.html