总结:1.二分,但是没有想到可能有线段同时覆盖两个节点
2.题目的样例对这种情况其实还是有提示的,以后做题注意用自己的算法覆盖好每个样例
3.想问题尽量全面,对满足端点重合情况的枚举
4.最主要的还是因为对题目的轻视导致做错,以后要尽量重视自己做的每一件事情
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 55
#define INF 1e9
double num[MAXN];
int n;
bool binary(double len)
{
double cur = num[0];
for(int i = 1;i < n;i++)
{
if(cur > num[i])return false;
else if(cur == num[i])continue;
if(num[i] - len >= cur)cur = num[i];
else cur = num[i] + len;
}
return true;
}
double run()
{
double l = 0,r = 2 * INF;
for(int i = 0;i < 100;i++)
{
double mid = (l + r) / 2;
if(binary(mid))l = mid;
else r = mid;
}
for(int i = 1;i < n;i++)
if(num[i] - num[i - 1] > l && binary(num[i] - num[i - 1]))
l = num[i] - num[i - 1];
return l;
}
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%lf",&num[i]);
sort(num,num + n);
double ans = run();
printf("%.3lf\n",ans);
}
}