F.求最大值

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给出一个序列,你的任务是求序列中 (a[j]-a[i])/(j-i)【1<=i<j<=n】的最大值

输入描述:

本题包含多组输入,每组输入第一行一个数字n,表示序列的长度。
然后接下来一行输入n个数,表示原先序列的样子。
数据范围:
3<=n<=200000
-1000000000<=a[i]<=1000000000

输出描述:

每组数据输出一行一个浮点数,保留两位小数,表示所求的最大值。
示例1

输入

5
2 4 6 8 10

输出

2.00

备注:

输入只有整形。

分析:问题转化为求序列中两点斜率的最大值,斜率最大值的两个点必为相邻的两点,
  方法1,可以通过画图得出结论;方法2,点a[i]与a[j]斜率实际上就是a[i]与
  a[i+1]的斜率k1a[i+1]与a[i+2]的斜率k2......a[j-1]与a[j]kj-i+1的斜率
  
这j-i+1个数的平均值k,则必有k<=max{k1,k2,...,kj-i+1},即最大值必为相邻两点
  的斜率。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 double a[300000];
 5 int main()
 6 {
 7     int N;
 8     while(scanf("%d",&N)!=EOF)
 9     {
10         double ans=-99999999999999;
11         scanf("%lf",&a[0]);
12         for(int i=1;i<N;i++)
13         {scanf("%lf",&a[i]);ans=max(ans,a[i]-a[i-1]);}
14         printf("%.2f\n",ans);
15     }
16     return 0;
17 }
View Code

 


posted @ 2017-12-19 21:57  ACRykl  阅读(259)  评论(0编辑  收藏  举报