본문 바로가기
알고리즘, 자료구조/알고리즘

2217 로프

by Wordbe 2019. 7. 25.
728x90

 

greedy 로 풀어봅시다.

 

예를 들어 로프의 정보가 다음과 같이 주어졌다고 합시다.

20 8 15 9 2

 

먼저 내림차순으로 정렬한 뒤, (그렇지 않으면 그리디하게 풀 수 없습니다.)

20 15 9 8 2

생각해봅시다.

 

1) 20

ans = 20

 

2) 20 15

현재 만들 수 있는 최대 중량 = 20

바뀐 최소 값(15)으로 만들 수 있는 최대 중량 = 30

ans = 30

 

3) 20 15 9

현재 만들 수 있는 최대 중량 = 30

바뀐 최소 값(9)으로 만들 수 있는 최대 중량 = 9 * 3 = 27

ans = 30

 

4) 20 15 9 8

현재 만들 수 있는 최대 중량 = 27

바뀐 최소 값(8)으로 만들 수 있는 최대 중량 = 8 * 4 = 32

ans = 32

 

5) 20 15 9 8 2

현재 최소인 값으로 만들 수 있는 최대 중량 = 32

바뀐 최소 값(15)으로 만들 수 있는 최대 중량 = 2 * 5 = 10

ans = 32

 

이렇게 하면 대략적으로 감이 답이 나온 것 같습니다.

그대로 코드로 옮겨보겠습니다.

 

#include <cstdio>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
vector<int> weights;

int main() {  
int n, w;  
scanf("%d", &n);  
for (int i = 0; i < n; ++i) {  
	scanf("%d", &w);  
	weights.emplace\_back(w);  
}  
sort(weights.begin(), weights.end(), greater());

int cnt = 0;
int ans = 0;
for (auto it = weights.begin(); it != weights.end(); ++it) {
    int new_sum = *it * ++cnt;
    if (new_sum > ans) ans = new_sum;
}
printf("%d\n", ans);
return 0;
}
728x90

'알고리즘, 자료구조 > 알고리즘' 카테고리의 다른 글

[Disjoint Set] 1717 집합의 표현  (0) 2019.08.26
[1931] 회의실배정  (0) 2019.07.29
1541 잃어버린 괄호  (0) 2019.07.25
1107 리모컨  (0) 2019.07.21
1018 체스판 다시 칠하기  (0) 2019.07.18

댓글