문제 : https://algospot.com/judge/problem/read/LUNCHBOX
알고리즘 문제 해결 전략 p.397
책을 참고하지 않고 코드를 작성함
[알고리즘 SPEP. 1]
최대한 효율적으로 도시락을 데워 먹으려면, 어차피 전자레인지는 계속 돌아가야 한다.
전자레인지에 돌리는 시간의 합(A) + 먹는데 쓰는 것 중에 저 시간을 넘어가는 시간(B)
을 최소화 해야 하는데, A는 어차피 고정값이고 B를 어떻게 최소화 할 지를 생각해야한다.
어차피 전자레인지를 다 돌린 후에야 도시락을 먹을 수 있으므로, 도시락 데우는 시간은 고려하지 않고, 먹는 시간이 짧은 순으로 도시락들을 정렬한다.
그 다음에 그 순서의 역순으로 전자레인지를 돌리도록 하면 최적의 해를 구할 수 있다. 즉 "먹는 시간이 짧은 순으로 선택"만 그리디로 구현하면 된다.
다음 예시를 위의 알고리즘대로 풀어보자.
도시락의 수 5
먹는데 걸리는 시간 1 1 1 1 20
데우는데 걸리는 시간 3 2 4 5 10
이미 먹는데 걸리는 시간대로 정렬해놓은 상태이다.
여기서 데우는데 걸리는 시간을 일단 다 더하고, (= 24) 그 다음에 먹는데 걸리는 시간이 작은 순서대로 다음 그림처럼 붙여 본다.
다섯개의 도시락은 순서대로 A, B, C, D, E로 표현했고, 데우는 시간은 회색 데우는 시간은 주황색으로 표현했다.
[최종코드]
#include <iostream> } |
[새로 알게 된 것들]
-vector<pair<int, int>> 를 특정 인덱스로 정렬
bool compare(const pair<int, int>&i, const pair<int, int>&j) { return i.second < j.second; }
'알고리즘' 카테고리의 다른 글
algospot :: BOARDCOVER2 게임판 덮기 2 (0) | 2017.10.21 |
---|---|
algospot :: STRJOIN 문자열 합치기 (0) | 2017.10.17 |
algospot :: MATCHORDER 출전 순서 정하기 (0) | 2017.10.17 |
그리디 알고리즘 (탐욕법, Greedy Algorithm) (0) | 2017.10.17 |
algospot :: NUMBERGAME 숫자게임 (0) | 2017.10.17 |