1. 程式人生 > >JZOJ5885. 【NOIP2018模擬9.27】物理實驗

JZOJ5885. 【NOIP2018模擬9.27】物理實驗

在這裡插入圖片描述
在這裡插入圖片描述

題解

這題,只要猜對結論,就可以了。
因為有三個變數,
不好找他們之間的關係,就先固定一個。
在固定aza_z的情況下,
很容易發現對於每個axa_x只有最靠近它的aya_y才最優。
也就是說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;
}