카테고리 없음
[1일 1알고] G5 1092 배
Basaeng
2026. 3. 28. 15:07

https://www.acmicpc.net/problem/1092
입력으로 주어지는 각 크레인에 화물을 적절히 분배하는 것이 문제입니다.
크레인은 무게 하중이 제한되어있기 때문에 이 조건을 지켜야합니다.
저는 적절히 분배하기 위해 화물과 크레인의 무게 제한을 역순으로 정렬하고 이를 통해 분배하는 방법을 생각했습니다.
for (int i = 0; i < M; ++i) //weights
{
for (int j = 0; j < N; ++j)//cranes
{
if (j == N - 1 || cranes[j + 1] < weights[i] || cnts[j+1] > cnts[j])
{
++cnts[j];
break;
}
}
}
만약 현재 크레인이 마지막 크레인이거나, 다음 크레인(무게 제한이 더 심한)이 현재 화물의 무게를 수용할 수 없거나, 다음 크레인이 현재 보유하는 물류가 현재 크레인보다 많다면 현재 크레인에 화물을 추가합니다.
무거운 물류부터 비교하기 때문에 조건이 적절할 것이라고 생각했습니다.
계산 후 가장 많은 화물을 가진 크레인의 cnt를 출력합니다.
#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
vector<int> cranes(N, 0);
for (int i = 0; i < N; ++i)
{
cin >> cranes[i];
}
sort(cranes.rbegin(), cranes.rend());
int M;
cin >> M;
vector<int> weights(M, 0);
for (int i = 0; i < M; ++i)
{
cin >> weights[i];
}
sort(weights.rbegin(), weights.rend());
vector<int> cnts(N, 0);
for (int i = 0; i < M; ++i)
{
if (weights[i] > cranes[0])
{
cout << -1;
return 0;
}
}
for (int i = 0; i < M; ++i) //weights
{
for (int j = 0; j < N; ++j)//cranes
{
if (j == N - 1 || cranes[j + 1] < weights[i] || cnts[j+1] > cnts[j])
{
++cnts[j];
break;
}
}
}
int result = 0;
for (int i = 0; i < N; ++i)
{
result = max(result, cnts[i]);
}
cout << result;
return 0;
}
역으로 정렬하고 비교하면 괜찮을 것이라는 느낌이 있어 다행히 이것이 답이되었지만 정확하게 왜 모든 경우에 부합하는지 설명은 좀 어렵네요