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;
}
这个想法很神奇~ 也可以用数组先把序列保存起来。