https://www.acmicpc.net/problem/2217



N 제한을 보면 O(N^2)만 하더라도 바로 시간초과에 걸리는 것을 알 수 있다.

접근 방법을 생각하다가 각각의 로프에 모두 동일한 중량이 가해진다는 것을 생각해서 바로 해결했다.



로프 마다 버틸 수 있는 중량을 오름차순으로 먼저 정렬한다.


첫 번째의 로프의 최대 중량으로 계산한다면 

(첫 번째 로프가 견딜 수 있는 무게) * (N) 이 견딜 수 있는 중량의 합이 될 것이다.


두 번째의 로프의 최대 중량으로 계산한다면 

(두 번째 로프가 견딜 수 있는 무게) * (N-1) 이 견딜 수 있는 중량의 합이 될 것이다.



이와 같은 방법으로 N번째 까지 중량의 합을 계산 하면서

최대 중량을 구하면 문제를 해결할 수 있다.



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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main(){
    
    int N;
    cin>>N;
    
    vector<int> vec(N,0);
    for(int i=0;i<N;i++)
        scanf("%d",&vec[i]);
    
    sort(vec.begin(),vec.end());
    
    int ans=0;
    for(int i=0;i<N;i++)
        ans=max(ans,vec[i]*(N-i));
    
    cout<<ans<<endl;
    
    return 0;
}
 
cs







 

'알고리즘(BOJ) > 그리디' 카테고리의 다른 글

백준 1049번 - 기타줄  (0) 2018.02.03
백준 10610번 - 30  (0) 2018.02.01
백준 1931번 - 회의실배정  (2) 2018.01.28
백준 11047번 - 동전 0  (0) 2018.01.28
백준 11399번 - ATM  (1) 2018.01.28

+ Recent posts