原题来源:
蒜头君看着眼前从左到右在一条线上的 nn 座山峰,他想从中选出两座山峰,作为旅行的起点和终点,要求选出的较左边的山峰高度大于选出的较右边的山峰,定义这样选择后这次旅行的困难程度为两座山峰的高度差。问所有可能的选择方案中困难程度最大的方案的困难程度是多少,如果没有合法方案,答案为 00 。
输入格式
输入有两行:
- 第一行为一个整数 nn,表示山峰的数目(1 \leq n \leq 10^51≤n≤105)
- 第二行为 nn 个空格隔开的整数 a_iai,为每座山峰的高度(1 \leq a_i \leq 10^91≤ai≤109)
输出格式
输出一行,包含一个整数,表示答案。
数据范围
对于 60\%60% 的数据,1 \leq n \leq 10 ^ 31≤n≤103
对于 100\%100% 的数据,1 \leq n \leq 10 ^ 51≤n≤105
Sample 1
Inputcopy | Outputcopy |
---|---|
4 1 5 3 9 | 2 |
这道题要是用动态规划求最长递减子序列思想可以但是会超时,因为n*n复杂度过不了
可以这样思考,每次输入的时候都求出前面所有中最大的数,也不用遍历所有数,建立一个数组用于存放1-当前的最大数,当前最大是当前数与上一个进行比较,得到最大即可
这样我们在输入完以后在重新遍历一次用刚才最大数组减去当前这个数就可以到得到每一个位置的相对最大,最后排序即可,详情参看代码
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int a[100005],b[100005];
int ans[100005];
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=max(a[i],b[i-1]);
}
for(int i=1;i<=n;i++)
{
ans[i]=b[i]-a[i];
}
sort(ans+1,ans+1+n);
cout<<ans[n];
return 0;
}