题解
这题,只要猜对结论,就可以了。
因为有三个变量,
不好找他们之间的关系,就先固定一个。
在固定
的情况下,
很容易发现对于每个
只有最靠近它的
才最优。
也就是说y=x+1,考虑固定下x,即也固定下来了y,什么时候z最优,
可以证明,在z依次变化中,这个利用率是单调的,可能递增也可能递减。
只有找到紧紧挨着的那一个,还有最远的那一个来判断一下就可以了。
code
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <math.h>
#define N 100003
#define ldb long double
#define G getchar
using namespace std;
char ch;
void read(int &n)
{
n=0;
ch=G();
while((ch<'0' || ch>'9') && ch!='-')ch=G();
int w=1;
if(ch=='-')w=-1,ch=G();
while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G();
n*=w;
}
int n,m,a[N],T,id;
ldb ans;
int main()
{
freopen("atom.in","r",stdin);
freopen("atom.out","w",stdout);
for(read(T);T;T--)
{
read(n);read(m);ans=-1;
for(int i=1;i<=n;i++)read(a[i]);
sort(a+1,a+1+n);id=1;
for(int i=1;i<n-1;i++)
{
if(a[i+2]-a[i]<=m)ans=max(ans,(ldb)(a[i+2]-a[i+1])/(a[i+2]-a[i]));
for(id=max(id,i+2);id<n && a[id+1]-a[i]<=m;id++);
if(a[id]-a[i]<=m)ans=max(ans,(ldb)(a[id]-a[i+1])/(a[id]-a[i]));
}
if(ans==-1)puts("-1");
else printf("%.13lf\n",(double)ans);
}
return 0;
}