这道题,比赛的时候想到解法了,最长的长度只可能是中间值,或者差值,但是教学楼要关门了,就没写,今天上午想了一下。也是调了很长时间,2个坑
1、一段区间可以覆盖两个端点
2、double
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
using namespace std;
/*int main()
{
int n = 100;freopen("input.txt","w",stdout);
cout <<n<<endl;
while(n--)
{
int m = rand() % 100;
cout <<m<<endl;
while(m--)
cout <<rand() % 100+1 <<" ";
cout <<endl;
}
}*/
double a[10001];
set <double> s;
set <double> :: iterator it,us;
int n,m;
double b[100001];
bool sol(double x)
{
b[m-1] = a[m-1];
for(int i=m-2;i>=1;i--)
{
if(b[i+1] >= a[i+1])
{
// if(x==1)cout << a[i]<<endl;
if(a[i+1]- a[i] >=x)
b[i] = a[i] + x;
else
if(a[i]-a[i-1] >=x)
b[i] = a[i] -x;
else return false;
}
else
{
if(b[i+1] -a[i] >= x||a[i+1]-a[i] ==x)
{
if(a[i+1]-a[i] ==x) b[i] = b[i+1];
else b[i] = b[i+1] -x;
}
else
if(a[i]-a[i-1] >=x)
b[i] = a[i] -x;
else return false;//if(x==1)cout << b[i]<<endl;
}
}
// cout <<x<<endl;
return true;
}
int main()
{//freopen("input.txt","r",stdin);
//freopen("out1.txt","w",stdout);
scanf("%d",&n);
while(n--)
{
s.clear();
scanf("%d",&m);
for(int i=0;i<m;i++)
cin >>a[i];
sort(a,a+m);
// for(int i=0;i<m;i++)
// cout <<a[i] <<" ";
//cout <<endl;
for(int i=1;i<m;i++)
{
s.insert(a[i]-a[i-1]);
s.insert((a[i]-a[i-1])/2);
}
it = s.end();it--;
us = s.begin();
us --;
for(;it != us;it--)
{
if(sol(*it)){printf("%.3lf\n",*it);break;}
}
}
}