2217번: 로프
N(1≤N≤100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하지만
www.acmicpc.net
k개의 로프를 이용하여 중량이 w인 물체를 들어올릴 때 각각의 로프에는 w/k만큼의 중량이 걸린다고 한다.
k개의 로프를 이용하는 경우 들어올릴 수 있는 물체의 최대 중량은 (들 수 있는 무게가 가장 낮은 로프 * k)로 나타낼 수 있다.
따라서, 여러개를 묶었을 때 들 수 있는 최대 중량은 들 수 있는 무게가 가장 낮은 로프에 의해 결정되기 때문에 들 수 있는 무게가 큰 로프 순으로 묶어서 중량을 계산해야 항상 최적해를 얻을 수 있다.
#include <iostream>
using namespace std;
int lope[100000];
int max(int a, int b) { return a > b ? a : b; }
void Quick_sort(int start, int end)
{
if (start >= end) return;
int pivot = start;
int i = start + 1;
int j = end;
while (i <= j)
{
while (i <= end && lope[i] >= lope[pivot])
i++;
while (j > start && lope[j] <= lope[pivot])
j--;
if (i > j)
{
int temp = lope[pivot];
lope[pivot] = lope[j];
lope[j] = temp;
}
else
{
int temp = lope[i];
lope[i] = lope[j];
lope[j] = temp;
}
}
Quick_sort(start, j - 1);
Quick_sort(j + 1, end);
}
int Greedy(int N)
{
Quick_sort(0, N - 1); // 내림차순 정렬
int ret = 0;
for (int i = 0; i < N; i++)
ret = max(ret, lope[i] * (i + 1));
return ret;
}
int main(void)
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
cin >> lope[i];
cout << Greedy(N) << endl;
return 0;
}
알고리즘 200일 프로젝트 - 110 day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1541번: 잃어버린 괄호 (0) | 2020.07.26 |
---|---|
백준 10610번: 30 (0) | 2020.07.26 |
백준 5585번: 거스름돈 (0) | 2020.07.26 |
백준 1931번: 회의실배정 (0) | 2020.07.26 |
백준 11047번: 동전 0 (0) | 2020.07.25 |