문제 출처:
https://www.acmicpc.net/problem/16112
이 문제를 풀기 위해서는 sort가 필요하며, 가장 큰 수를 얻기 위해서는 제일 작은 수를 먼저 사용하여 아케인스톤을 만드는게 중요하다.
//P_16112
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, k;
// find_Sum_Experience_Point
int main(int argc, const char * argv[]) {
ios::sync_with_stdio();
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> k ;
vector<int> v;
for(int i = 0 ; i < n ; i ++){
int tmp;
scanf("%d", &tmp);
v.push_back(tmp);
}
// 0번째는 0
// 1번쨰는 제일 작은 수를 제외한 수의 합
// 2번째는 제일 작은 수와 두번쨰 수를 제외한 수의 합
// ... 이러한 것들이 k개 존재
sort(v.begin(), v.end());
long long int sum = 0 ;
int i = 0 ;
// v.at(j) * i /(3*10^5*10*8/)
for(int j = 0 ; j < n ; j ++){
sum += (long long int)v.at(j) * (long long int)i ;
if (i < k)
i++;
}
printf("%lld\n", sum) ;
return 0;
}
이 문제를 해결하기 위해서 array를 사용하고자 했지만 시간 초과를 계속 유발하기에 별로 사용해보지 않은 vector를 사용하기로 했다.
해당 내용은 Github에서도 보실 수 있습니다.
https://github.com/gurcks8989/CodingTest/blob/master/BackJoon/HPS/P16112_5th_changeJob.cpp
훈수 및 조언은 언제든지 환영입니다.