1. 程式人生 > >【JZOJ A組】物理實驗

【JZOJ A組】物理實驗

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);
	}
}