문제
N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.
하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.
각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.
입력
첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 자연수이다.
출력
첫째 줄에 답을 출력한다.
예제 입력 1
2
10
15
예제 출력 1
20
풀이
이번 문제는 그리디 알고리즘을 이용하여 풀이하는 문제이다.
최대중량이 있는 여러개의 로프들을 가지고 들어올릴 수 있는 최대 중량을 찾아 내야 한다.
예를 들어 4개의 로프가 있고 각각의 최대중량이 10, 5, 7, 3이라고 하면
1개의 로프만을 이용할때의 최대: 10
2개의 로프를 이용할 때의 최대: 10과 7을 이용해 -> 14
3개의 로프를 이용할 때의 최대: 10과 7 과 5를 이용해 -> 15
4개의 로프를 이용할 때의 최대: 10과 7 과 5 와 3을 이용해 -> 12
가 된다.
최종적으로 최대무게는 15가 된다.
이를 통해 하나의 규칙을 찾을 수 있는데
n개의 로프를 사용할 경우 : n개중 가장 작은 중량의 로프의 최대 중량 * n이 버틸 수 있는 최대 중량이 된다는 것이다.
이러한 규칙을 통해 최대 중량을 찾으면 된다.
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
priority_queue<pair<int, int>> pq;
int arr[100000];
int main(void){
int n;
int w;
int i;
int max = 0;
int temp;
scanf("%d", &n);
for(i=0; i<n; i++){
scanf("%d", &w);
pq.push(make_pair(w, i));
}
i=0;
while(!pq.empty()){
arr[i] = pq.top().first;
i++;
pq.pop();
}
for(i=1; i<=n; i++){
temp = arr[i-1]*i;
if(temp > max)
max = temp;
}
printf("%d\n", max);
}
'알고리즘 > PS - 백준' 카테고리의 다른 글
[백준 4796 - C++] 캠핑 : 그리디 알고리즘 (0) | 2021.02.07 |
---|---|
[백준 1946 - C++] 신입사원 : 그리디 알고리즘 (0) | 2021.02.07 |
[백준 2437 - C++] 저울 : 그리디 알고리즘 (0) | 2021.02.03 |
[백준 1715 - C++] 카드 정렬하기: 그리디 알고리즘 (0) | 2021.02.03 |
[백준 13549 - C++] 숨바꼭질 3 : 다익스트라(Dijkstra) (6) | 2021.02.03 |