山路艰险 (定一移一思想)

原题来源: 

山路艰险 I - 题库 - 计蒜客 

蒜头君看着眼前从左到右在一条线上的 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 ^ 5​1≤n≤105​

Sample 1

InputcopyOutputcopy
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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值