개발/알고리즘
백준 11399번 : ATM
라사 RASA
2020. 8. 16. 18:22
문제 접근
이 문제는 부분합의 총합이 최소가 되게 하는 문제이다. x 번 사람이 대기하는 시간을 Px 라고 할 때 5명이 대기한다면 부분합의 총합 Ans = 5*P1 + 4*P2 + 3*P3 + 2*P4 + 1*P5 이다. 따라서 n 에 대해 Pn = n*P1 + (n-1)*P2 + (n-2)*P3 + ... + 2*P(n-1) + 1*Pn 이라고 할 수 있다. 고로 작은 순으로 정렬한 뒤 부분합의 총합을 구하면 끝!
문제 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
int N, ans;
cin>>N;
vector<int> P(N);
for(int i=0; i<N; ++i)
cin>>P[i];
sort(P.begin(), P.end());
ans = P[0];
for(int i=1; i<N; ++i)
{
P[i]+=P[i-1];
ans += P[i];
}
cout<<ans<<'\n';
}