洛谷 P5146 最大差值 题解

P5146 最大差值

题目描述

HKE最近热衷于研究序列,有一次他发现了一个有趣的问题:

对于一个序列\(A_1,A_2\cdots A_n\)​,找出两个数\(i,j\)\(1\leq i<j\leq n\),使得\(A_j-A_i\)​最大。

现在给出这个序列,请找出\(A_j-A_i\)​的最大值。

输入格式

第一行为一个正整数\(n\)

接下来\(n\)行整数,第\(k+1\)行的整数为\(A_k\)​。

输出格式

一行为\((A_j-A_i)\)的最大值

输入输出样例

输入 #1

10
1 3 4 6 7 9 10 1 2 9

输出 #1

9

说明/提示

对于30%的数据,\(n\leq1000\)

扫描二维码关注公众号,回复: 7508895 查看本文章

对于70%的数据,\(n\leq100000\)

对于100%的数据,\(2\leq n\leq1000000\)\(A_i\)​的值在int范围内

【思路】

贪心

【题目大意】

求这一串数字里面任意两个数差最大是多少

【题目分析】

因为是任意两个数
没有区间长度的限制
所以用不到单调队列
当前的数一定是在减去前面最小的那个数的情况最优
(包括自己)
这样只需要用一个变量
来记录到目前为止最小的数就好了
每一次的差都比较一下
最后输出差最大的值

【完整代码】

#include<iostream>
#include<cstdio>

using namespace std;
const int Max = 1000006;
int a[Max];
int main()
{
    int n;
    cin >> n;
    for(register int i = 1;i <= n;++ i)
        cin >> a[i];
    int M = a[1];
    int ans = 0;
    for(register int i = 1;i <= n;++ i)
    {
        M = min(M,a[i]);
        ans = max(ans,a[i] - M);
    }
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/acioi/p/11703699.html