문제 링크
풀이
naive하게는 번째 인덱스에서 그 뒤에 있는 모든 인덱스 에 대해서 의 최댓값을 구하는 방법이 있다.
이 경우 시간복잡도는 이며, 시간 내에 풀 수 없다.
이 문제는 다음과 같은 아이디어로 풀 수 있다.
앞에서부터 쭉 훑다가 지금까지 나온 값 중 가장 큰 값이 나온 상황을 가정하자.
그러면 지금까지 나온 값은 무시하고 최댓값을 선택하는 게 이득이다.
이고 에서 가 크면 클 수록 최적이기 때문이다.
새로운 최댓값이 나왔다면 그 이후부터 등장하는 최솟값을 찾아야 한다.
그 이전에 등장한 최솟값은 쓸모가 없어지기 때문이다.
이런 방식으로 풀면 시간복잡도는 이 된다.
C++ 코드
더보기
#include <bits/stdc++.h>
#define X first
#define Y second
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define ini(x, y) memset(x, y, sizeof(x))
#define endl '\n'
#define fastio cin.tie(nullptr)->sync_with_stdio(false)
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
const int MOD = 1e9 + 7;
const int dx[] = { -1, 0, 1, 0, -1, 1, 1, -1 };
const int dy[] = { 0, 1, 0, -1, 1, 1, -1, -1 };
int main() {
fastio;
int n;
cin >> n;
int ans = 0, mx = 0, mn = 1e9;
for (int val, i = 0; i < n; ++i) {
cin >> val;
if (mx < val) mx = mn = val;
else mn = min(mn, val);
ans = max(ans, mx - mn);
}
cout << ans;
return 0;
}
'PS > boj' 카테고리의 다른 글
[BOJ] 5100 Jean and Joe’s Clothes (0) | 2021.02.02 |
---|---|
[BOJ] 20743 Bus Numbers (0) | 2021.01.31 |
[BOJ] 19774 ABCD-код (0) | 2021.01.29 |
[BOJ] 8965 Circular Sequence (0) | 2021.01.27 |
[BOJ] 12779 상품 is 뭔들 (0) | 2021.01.24 |