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



기다리는 각 사람 별로 기다리는 시간의 합을 구하는 문제이다.

그리디 알고리즘으로 분류되어 있는데...
그냥 정렬해서 합을 구하면 된다.

2중 for 문으로 n 번째 사람별로 처음부터 n 번째까지의 시간을 구할 수도 있는데
1번째 사람의 인출 시간은 총 시간에서 n 번 더하게 되고 
2번째 사람의 인출 시간은 총 시간에서  n-1 번 더하게 된다.(1번째 사람 제외)
...
n 번째 사람의 인출 시간은 총 시간에서 1번 더하게 된다.


이런 식으로 for 문 한 번만 써서 구하면 시간을 단축시켰다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main(){
    
    int n,ans=0;
    cin>>n;
    
    vector<int> vec(n,0);
    for(int i=0;i<n;i++)
        scanf("%d",&vec[i]);
    
    sort(vec.begin(),vec.end());
    for(int i=0;i<n;i++)
        ans+=vec[i]*(n-i);
    
    cout<<ans<<endl;
 
    return 0;
}
cs


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

백준 1049번 - 기타줄  (0) 2018.02.03
백준 10610번 - 30  (0) 2018.02.01
백준 2217번 - 로프  (0) 2018.01.31
백준 1931번 - 회의실배정  (2) 2018.01.28
백준 11047번 - 동전 0  (0) 2018.01.28

+ Recent posts