【JZOJ A組】物理實驗
阿新 • • 發佈:2018-12-12
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); } }