N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.
하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.
각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.
수학
그리디 알고리즘
정렬
로프를 1
개서부터 n
개까지 선택해본다고 하자. 1
개여도 가장 가중치가 높은 로프를 선택할 것이다. 2
개인 경우에도 가중치가 가장 높은 로프와 그 다음으로 가중치가 높은 로프를 선택할 것이다. 이런식으로 k
개의 로프를 선택한다고 하면 가장 가중치가 높은 로프부터 k
번째로 가중치가 높은 로프까지 선택하게 될 것이다. 여기서 2
개 이상의, k
개의 로프를 선택하게 되면, 결국 들 수 있는 무게의 한계는 (선택한 로프 중 가장 낮은 가중치) * k
가 될 것이다. 1
개부터 k
개까지 로프를 선택해나가며 그 최대값을 구하면 된다.
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, in, res = 0;
vector<int> v;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", &in);
v.push_back(in);
}
sort(v.begin(), v.end(), greater<int>());
for (int i = 0; i < n; i++)
res = max(res, v[i] * (i + 1));
cout << res;
return 0;
}