문제

boj2217

문제를 이해하는데 시간이 꽤 걸린 문제이다.

예를 들어 각각 최대 3, 5, 4, 2, 1의 중량을 버틸 수 있는 로프 A, B, C, D, E가 있다고 하고, 들어올릴 물체의 중량을 w라 하자. 문제에서 모든 로프를 사용해야 할 필요가 없다고 했으므로 물체를 들어올리는 방법을 다섯 가지로 나눌 수 있다.

로프 다섯 개를 모두 사용하는 경우

문제에서 각각의 로프에는 모두 고르게 (물체의 중량) / (사용하는 로프의 개수)만큼의 중량이 걸린다고 제시되었으므로 로프마다 걸리는 중량은 w/5이다. 만약 하나의 로프라도 자신이 버틸 수 있는 중량보다 더 큰 중량을 들어올려야 하는 경우 그 로프는 끊어진다.

물체의 중량 w=13이라 해보자. 그러면 각 로프가 들어올려야 할 중량은 13/5=2.6이다. 로프 A, B, C는 각각 3, 5, 4의 중량을 버틸 수 있으므로 로프가 끊어지지 않는다. 그러나 로프 D, E는 버틸 수 있는 중량보다 들어올려야 할 중량이 더 크기 때문에 끊어질 것이다.

따라서 각 로프가 들어올려야 할 중량은 버틸 수 있는 중량이 가장 작은 로프가 최대로 버틸 수 있는 중량이 되어야 한다. 이를 식으로 표현하면 (물체의 중량) / (사용하는 로프의 개수) = min(로프 별 버틸 수 있는 중량)이다.
따라서 로프 다섯 개를 모두 사용할 때 들어올릴 수 있는 물체의 중량의 최댓값은 1*5=5이다.

버틸 수 있는 중량이 최소인 로프를 찾아야 하므로 로프를 오름차순으로 정렬해놓는 것이 좋다.

로프 네 개만 사용하는 경우

다섯 개의 로프 중 네 개를 골라, 위에서와 동일한 방식으로 계산하면 된다.

그러나 네 개의 로프를 고르는 모든 경우에 대해 실행할 필요가 없다. 왜일까?

{1, 3, 4, 5}를 골랐을 때와 {2, 3, 4, 5}를 골랐을 때를 비교해보자. {1, 3, 4, 5}를 골랐을 때 들어올릴 수 있는 최대 중랑은 14=4이고, {2, 3, 4, 5}를 골랐을 때 들어올릴 수 있는 최대 중랑은 24=8이다.

여기서 우리는 로프들을 가능한 큰 값들로 골라야 한다는 것을 알 수 있다. 로프들을 미리 정렬해 놓았으므로, 로프 배열의 뒤에서부터 가장 큰 로프 네 개를 고르면 된다.

따라서 로프 네 개를 사용할 때 들어올릴 수 있는 물체의 중량의 최댓값은 2*4=8이다.

로프 세 개만 사용하는 경우

2에서와 동일한 방법으로 계산한다. 로프 {3, 4, 5}를 사용해 3*3=9의 물체를 들어올릴 수 있다.

로프 두 개만 사용하는 경우

로프 {4, 5}를 사용해 2*4의 물체를 들어올릴 수 있다.

로프 하나만 사용하는 경우

로프 5를 사용해 1*5의 물체를 들어올릴 수 있다.

구현

#include <iostream>
#include <vector>
#include <algorithm> // sort
#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	int N, i, w, tmp;
	vector<int> v;
	
	cin >> N;
	for (i = 0; i < N; i++) {
		cin >> tmp;
		v.push_back(tmp);
	}

	sort(v.begin(), v.end());

	w = 0;
	for (i = 0; i < N; i++) {
		tmp = (N - i) * v[i];
		w = MAX(w, tmp);
	}
	cout << w << endl;
	return 0;
}