【JZOJ A组】物理实验

版权声明:转载者乖乖♂站好 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);
	}
}

猜你喜欢

转载自blog.csdn.net/Eric1561759334/article/details/82889238
今日推荐