반응형
문제 출처 :
https://www.acmicpc.net/problem/8980
알고리즘 분석 :
문제 해결에 필요한 사항
1. 그리디 알고리즘
이 문제를 해결하기위해서 그리디 알고리즘을 이용한다.
이때 그리디 알고리즘을 어느 부분에 기준을 잡느냐에 따라 AC / WA가 나오게 되는데 필자는 처음에 보내는 박스의 개수를 기준으로 그리디를 진행했다가 WA를 받았다.
그리디를 어떻게 적용할까 생각하다보니, 최대한 가까운 곳에 많이 보낼 수록 트럭에 적재할 수 있는 내용물들이 많아진다는 것을 알아냈다.
결국 그리디는 다음과 같이 이용하면 AC를 받을 수 있다.
-> 최대한 가까운 곳에 많이 보낼 수 있도록 정렬을 하여 O(N*M)에 해결하라.
부가적인 내용은 주석을 통해 달아두었다.
소스 코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef pair<int, pair<int, int> > pii; int truck[10002]; pii arr[10002]; int main() { int n, c, m; scanf("%d %d %d", &n, &c, &m); for (int i = 0; i < m; i++) { int from, to, val; scanf("%d %d %d", &from, &to, &val); arr[i].first = to; arr[i].second.first = from; arr[i].second.second = val; } // to를 기준으로 정렬 sort(arr, arr + m); long long ans = 0; for (int i = 0; i < m; i++) { int get = 0; int from = arr[i].second.first; int to = arr[i].first; int val = arr[i].second.second; // 트럭이 적재하고 있는 최댓값을 구한다. for (int j = from; j < to; j++) get = max(get, truck[j]); // 트럭에 실을 수 있는 최솟값을 구한다. get = min(c - get, val); ans += get; // 트럭에 누적 적재 합을 더해준다. for (int j = from; j < to; j++) truck[j] += get; } printf("%lld", ans); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1152번] 단어의 개수 (0) | 2017.08.12 |
---|---|
[2168번] 타일 위의 대각선 (0) | 2017.08.12 |
[2011번] 암호코드 (2) | 2017.08.08 |
[14653번] 너의이름은 (0) | 2017.08.07 |
[2108번] 통계학 (0) | 2017.08.06 |