求最大值(qduoj)QDU创新实验室第二次月赛B题

来源:互联网 发布:c语言sleep没反应 编辑:程序博客网 时间:2024/05/17 01:04

描述:

给定n个数,a[1]到a[n],请你帮忙找出a[i] - a[j]的最大值,其中1 <= i < j <= n

输入:

第一行一个数T,表示一共有T组数据(T <= 20); 每组测试数据第一行一个整数n(2 <= n <= 10 ^ 5),表示接下来有n个数,第二行n个整数,不超过10 ^ 6,中间用空格隔开。

输出:

每组数据输出一行,表示最大值是多少。

样例输入:

255 2 3 6 123 2
样例输出:

51
思路

一看到该题,立刻想到了一个O(n)的算法,也就是紫书上构造数据结构优化算法的方法。   我们可以维护一个递减序列,这样,在序列中头上的元素就是最大的,尾上的元素就是最小的,顺便维护答案,扫一遍就行了。   由于每个元素都进队列一次出队列一次,所以复杂度O(n)。

好像该题可以用动归来做,不过不如这样快。

细节参见代码:

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<map>using namespace std;typedef long long ll;const int INF = 1000000000;const double eps = 1e-6;const int maxn = 100000 + 5;int T,n,a[maxn],kase=0,cur[maxn];int main() {    scanf("%d",&T);    while(T--) {        scanf("%d",&n);        for(int i=0;i<n;i++) {            scanf("%d",&a[i]);        }        int l = 0, r = 0,ans = -INF;        cur[0] = a[0]; r++;        for(int i=0;i<n;i++) {            ans = max(ans,cur[0]-a[i]);            for(int j=r-1;j>=0;j--) {                if(cur[j] < a[i]) r--;            }            cur[r++] = a[i];        }        printf("%d\n",ans);    }    return 0;}



0 0