版权声明:转载者乖乖♂站好 https://blog.csdn.net/Eric1561759334/article/details/82889238
Description
Input
Output
Sample Input
1
5 5
1 2 5 8 9
Sample Output
0.75
Data Constraint
思路
题目描述好像有点迷
意思是在A集合里选三个数,使得(z-y)/(z-x) (z-x<=m)最大
首先,显而易见,z越大越好,但因为有z-x<=m这个条件,并不是越大越好,所以我们考虑用一个队列从小到大存储z,当不满足条件时,就从队列里取出一个z
其次,y-x越小越好,y+x越大越好,所以从大到小排序后枚举即可
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int t,a[100077],n,m;
double ans;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
// freopen("atom.in","r",stdin); freopen("atom.out","w",stdout);
scanf("%d",&t);
while(t--)
{
queue<int> q; while(!q.empty()) q.pop();
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
ans=0;
sort(a+1,a+n+1,cmp);
int y=a[2],x,z=a[1];
for(int i=3; i<=n; i++)
{
x=a[i];
while(z-x>m&&!q.empty()) z=q.front(),q.pop();
if(z-x<=m)
{
ans=max(ans,(double)(z-y)/(z-x));
}
q.push(y); y=x;
}
if(ans==0) printf("-1\n");else
printf("%.12lf\n",ans);
}
}