题目描述
给定一个递增序列和U,找出满足 i < j < k i<j<k i<j<k, E k < E i < U E_k<E_i<U Ek<Ei<U的最大的 E k − E j E k − E i \frac {E_k-E_j}{E_k-E_i} Ek−EiEk−Ej。
题解
数形结合一下就会发现,如果只看后面的式子,
i
,
j
i,j
i,j越远值就越小,所以干脆枚举
i
,
j
=
i
+
1
i,j=i+1
i,j=i+1然后根据糖水不等式我们只需要二分出一个最大的k但要满足题设的就可以了
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 1000005
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
LL read(){
LL res=0,f=1; char c;
while(!isdigit(c=getchar())) if(c=='-') f=-1;
res=c^48;
while(isdigit(c=getchar())) res=(res<<1)+(res<<3)+(c^48);
return res*f;
}
int n,m,a[maxn];
double ans=-1;
int main(){
n=read(); m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n-2;i++){
int k=upper_bound(a+i,a+n+1,a[i]+m)-a-1;
if(k-i<2) continue;
ans=max(ans,1.0*(a[k]-a[i+1])/(a[k]-a[i]));
}
if(ans==-1) puts("-1");
else printf("%.8lf",ans);
}