알고리즘/PS - 백준

[백준 2217 - C++] 로프 : 그리디 알고리즘

excited-hyun 2021. 2. 7. 15:51
반응형

www.acmicpc.net/problem/2217

 

2217번: 로프

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

www.acmicpc.net

문제

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);
}
728x90
반응형