题目链接:http://codeforces.com/contest/957/problem/C
题意:输入n,u,给你n个数,严格单调递增,数据范围1e9.,然后让你选出三个数,下标分别为i,j,k,(i<j<k),且a[k]-a[i]<=u,求(a[k]-a[j])/(a[k]-a[i])的最大值。
分析:显然题目要求的公式的最大值可化为(a[k]-a[j])/(a[j]-a[i]+a[k]-a[j]),要使比值最大,对于每一个i需要使a[j]-a[i]变小,a[k]-a[j]变大,由于题目给定a[k]-a[i]<=u,a[j]-a[i]最小即为j=i+1;这样我们只需要对于每一个i找到最大的k使得a[k]-a[i]<=u即为起始为i的函数的最大值。
AC代码:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int n,u; 6 int a[100005]; 7 int main(){ 8 ios_base::sync_with_stdio(0); 9 cin.tie(0); 10 while(cin>>n>>u){ 11 for(int i=1;i<=n;i++){ 12 cin>>a[i]; 13 } 14 double re=-1; 15 for(int i=1;i<=n;i++){ 16 int low=i+2,high=n; 17 int result=-1; 18 while(low<=high){ 19 int mid=(low+high)/2; 20 if(a[mid]-a[i]<=u){ 21 result=mid; 22 low=mid+1; 23 } 24 else { 25 high=mid-1; 26 } 27 } 28 if(result!=-1){ 29 re=max(re,(double)(a[result]-a[i+1])/(double)(a[result]-a[i])); 30 } 31 } 32 if(re==-1){ 33 cout<<-1<<endl; 34 } 35 else { 36 cout<<fixed<<setprecision(9)<<re<<endl; 37 } 38 } 39 return 0; 40 }