728x90
반응형
29155번: 개발자 지망생 구름이의 취업 뽀개기
문제
https://www.acmicpc.net/problem/29155
29155번: 개발자 지망생 구름이의 취업 뽀개기
난이도 $1$에서 $1$분, $4$분, $4$분 순서로, 난이도 $2$에서 $5$분, 난이도 $3$에서 $20$분, 난이도 $4$에서 $40$분, 난이도 $5$에서 $100$분 순서대로 풀면 $1+3+4+0+4+60+5+60+20+60+40+60+100=417$분이 걸린다.
www.acmicpc.net
풀이
각 난이도 별로 문제를 푸는 데 걸리는 시간을 저장하고 오름차순으로 정렬한다. 각 난이도별로 풀어야하는 문제의 수만큼 앞에서부터 고르면 된다.
이 문제에서는 문제를 푸는 데 필요한 시간을 최소화하고 휴식시간도 최소화해야한다. 휴식시간은 같은 난이도 문제 사이에는 걸리는 시간의 차 만큼 휴식시간이 필요하다. 문제가 푸는 데 오래 걸리는 문제일수록 휴식시간도 늘어나는 것은 직관적으로 알 수 있으므로 푸는데 걸리는 시간이 적은 문제들만 고르면 된다.
그리고 각 난이도 사이엔 이와 관계 없이 60분의 휴식이 필요하다. (조건문으로 문제를 풀었지만, 각 난이도에서 1문제 이상 풀어야함이 조건으로 주어져있기 때문에 240분을 더한 다음 시작해도 된다.)
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
// 풀어야하는 문제 수
int p[6];
for (int i = 1; i <= 5; i++)
cin >> p[i];
// x번 문제를 푸는 데 y분 걸린다.
vector<vector<int>> t(6);
for (int i = 0; i < n; i++) {
int x, y;
cin >> x >> y;
t[x].push_back(y);
}
// 난이도별 오름차순 정렬
for (int i = 1; i <= 5; i++)
sort(t[i].begin(), t[i].end());
int ans = 0;
int cnt = 0;
for (int i = 1; i <= 5; i++) {
cnt++;
for (int j = 0; j < p[i]; j++) {
if (j == 0) { // 현재 난이도의 첫번째 문제인 경우
ans += t[i][j]; // 문제를 푸는 데 걸리는 시간 추가
if (cnt != 1) { // 난이도가 1이 아닌 경우
ans += 60; // 휴식시간 60분 추가
}
} else { // 현재 난이도의 첫번째 문제가 아닌 경우
ans += 2 * t[i][j] - t[i][j - 1]; // 다음 문제를 푸는 데 걸리는 시간 + 휴식시간 추가
}
}
}
cout << ans;
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 29159 케이크 두 개 (2) | 2023.09.05 |
---|---|
[백준 / BOJ] C++ 29156 탭 UI (2) | 2023.09.04 |
[백준 / BOJ] C++ 28683 피타! 피타! 피타츄! (2) | 2023.08.17 |
[백준 / BOJ] C++ 28682 재우야 임관하자 (2) | 2023.08.17 |
[백준 / BOJ] C++ 28445 알록달록 앵무새 (2) | 2023.08.17 |