JZOJ5885. 【NOIP2018模擬9.27】物理實驗
阿新 • • 發佈:2019-02-04
題解
這題,只要猜對結論,就可以了。
因為有三個變數,
不好找他們之間的關係,就先固定一個。
在固定的情況下,
很容易發現對於每個只有最靠近它的才最優。
也就是說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; }