https://www.acmicpc.net/problem/1092
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> lim;
vector<int> box;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;
int ans = 0;
cin >> n;
lim.resize(n);
for (int i = 0; i < n; i++) {
cin >> lim[i];
}
sort(lim.begin(), lim.end(), greater<int>());
cin >> m;
box.resize(m);
for (int i = 0; i < m; i++) {
cin >> box[i];
}
sort(box.begin(), box.end(), greater<int>());
if (box.front() > lim.front()) {
cout << -1;
return 0;
}
while (!box.empty()) {
ans++;
for (int i = 0; i < lim.size(); i++) {
for (int j = 0; j < box.size(); j++) {
if (lim[i] >= box[j]) {
box.erase(box.begin() + j);
break;
}
}
}
}
cout << ans;
return 0;
}
1. 문제
n개의 크레인의 무게 제한과 m개의 상자의 무게가 주어진다. n개의 크레인을 사용하여 m개의 상자를 배로 옮기려 한다. 한 개의 크레인은 하나의 상자를 옮길 수 있고, 그 때 걸리는 시간은 1이다. n개의 크레인을 동시에 운용할 수 있을 때, 모든 상자를 배로 옮기는 데 걸리는 최소 시간을 구하라.
2. 풀이
그리디 문제이다. 가장 무거운 상자를 가장 무게 제한이 높은 크레인으로 배로 옮기는 방식을 사용하여 해결할 수 있다.
sort(lim.begin(), lim.end(), greater<int>());
sort(box.begin(), box.end(), greater<int>());
우선 크레인과 상자 배열을 내림차순으로 정렬한다.
if (box.front() > lim.front()) {
cout << -1;
return 0;
}
가장 무거운 상자가 크레인의 가장 높은 제한보다 더 무겁다면 모든 상자를 배로 옮길 수 없으므로 -1을 출력한다.
while (!box.empty()) {
ans++;
for (int i = 0; i < lim.size(); i++) {
for (int j = 0; j < box.size(); j++) {
if (lim[i] >= box[j]) {
box.erase(box.begin() + j);
break;
}
}
}
}
각 크레인에 대해 상자를 옮길 수 있다면 해당 상자를 배열에서 지운다. 모든 크레인을 다 확인한 후 상자가 남아있다면 같은 연산을 계속 진행하여 상자를 차례로 배로 옮긴다. 옮길 때마다 시간 값인 ans를 더해준다. 이를 출력하면 정답을 구할 수 있다.
'Coding Test' 카테고리의 다른 글
백준 14247 나무 자르기 (0) | 2024.07.06 |
---|---|
백준 1946 신입 사원 (0) | 2024.07.04 |
백준 2212 센서 (0) | 2024.06.29 |
백준 19598 최소 회의실 개수 (0) | 2024.06.28 |
백준 5904 Moo 게임 (0) | 2024.06.24 |