首页 > 代码库 > BestCoder Round #4(Miaomiao's Geometry-贪心)

BestCoder Round #4(Miaomiao's Geometry-贪心)

Miaomiao‘s Geometry

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1016 Accepted Submission(s): 276


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

Source
BestCoder Round #4

Recommend
hujie | We have carefully selected several similar problems for you:49704969 4968 4967 4966

我的原先想法是二分所有整数解

后来发现有可能是半整数

5
1 2 5 6 8

所以改成了验证所有小数,仍错

发现是因为没有考虑到1条segment同时覆盖2点的情况

仍WA,

发现答案一定是某段区间的长度(或一半)否则必定可以继续拉长线段

加入优化,过。可能原先的Tle显示成wa或者溢出?了


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (50+100)
#define eps (1e-6)
#define MAXLen (2000000000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int t,n,a[MAXN];
bool check(double x)
{
	double t=a[1];
	Fork(i,2,n-1)
	{
		if (t==(double)a[i]) continue;
		else if (t<=(double)a[i]-x) t=(double)a[i];
		else if ((double)a[i]+x<=(double)a[i+1]) t=(double)a[i]+x;
		else return 0;		
	}
	return 1;
}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		For(i,n) scanf("%d",&a[i]);
		sort(a+1,a+1+n);
		double l=0,r=0,ans=0;
		Fork(i,2,n)
		{
			if (check((double)a[i]-a[i-1])) ans=max(ans,(double)a[i]-a[i-1]);
			else if (check(((double)a[i]-a[i-1])/2)) ans=max(ans,((double)a[i]-a[i-1])/2);
		}
		printf("%.3lf\n",ans);
		
	}
	
	
	return 0;
}