펭로그

[C++] 백준 BOJ 2217 로프 본문

Study/PS(Algorithm)

[C++] 백준 BOJ 2217 로프

노랑펭귄 2019. 1. 30. 16:33

문제링크 : https://noj.am/2217


각 로프에는 동일한 하중이 걸려야 한다는 점이 이 문제의 핵심이다.

이때, 각각의 로프에 걸리는 하중은 병렬로 연결되어 있는 어떤 로프의 최대 중량을 초과할 수는 없다.

그렇기 때문에 현재 병렬로 연결되어있는 로프 중에서 가장 적은 수치의 최대 중량이 각 로프들에 걸릴 수 있는 최대 하중이 되는 것이다.

따라서, 임의로 뽑은 로프들 중에서 가장 값이 작은 것을 뽑은 로프의 갯수 만큼 곱하면 답을 구할 수 있다.


각 로프의 최대 하중을 담은 배열을 내림차순으로 정렬하여 최대 하중 값이 큰 것부터 차례대로 계산을 해주고 그 중에서 최대치만을 답으로 출력하면 된다.


예를 들자면, [110, 70, 20, 5, 35, 40]의 배열이 있다면 이를 내림차순 정렬하여 [110, 70, 40, 35, 20, 5]로 바꾸어 준 후

110*1 / 70*2 / 40*3 / 35*4 / 20*5 / 5*6 이런 순서대로 계산을 해준 것들 중에서 가장 큰 값을 정답으로  출력한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// BOJ_2217 로프
#include <iostream>
#include <algorithm>
#include <numeric>
 
using namespace std;
 
int rope[100001];
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    int N;
    cin >> N;
    for (int i = 0; i < N; i++)
        cin >> rope[i];
    sort(rope, rope + N, greater<int>());
 
    long long result = 0;
    for (int i = 0; i < N; i++) {
        long long sum = rope[i] * (i + 1);
        if(sum > result)
            result = sum;
    }
    cout << result;
 
    return 0;
}
cs


Comments