uva11078 Open Credit System

May 21, 2013
Uva

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2019 题目大意:   给一个长度为n的序列,求Ai - Aj (i < j)的最大值。序列的长度最大是10^5 题目思路:   动态维护某一个数字之前的最大值,不断更新之。同时不断更新结果ans,更新的方法是ans和当前数字之前的最大值与这个数字作差,取其中的最大值。时间复杂度O(N),空间复杂度O(1)


#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
void solve() {
  int t; scanf("%d", &t);
  while (t--) {
    int n; scanf("%d", &n);
    int a, b; scanf("%d%d", &a, &b);
    int i, Max = max(a,b), ans = a - b;
    for (i = 0; i < n - 2; ++i) {
      scanf("%d", &b);
      ans = max(ans, Max - b);
      Max = max(Max, b);
    }
    printf("%d\n", ans);
  }
}
int main(void) {
  //freopen("11078.in", "r", stdin);
  solve();
  return 0;
}

这个想法很神奇~ 也可以用数组先把序列保存起来。

comments powered by Disqus