사람들이 소요하는 시간이 오름차순이 되어야 누적합이 최소가 된다. 
map <고객번호, 소요시간> 으로 받고, 
소요시간 기준(map의 value) 으로 오름차순이 되도록 정렬한다. 
 
map<int,int>  → vector<pair<int,int>> 변환 
  vector<pair<int,int>> v(bmap.begin(), bmap.end()); // map -> vector
 
sort() 함수에 비교함수 작성 
bool comp(pair<int,int> &left, pair<int,int> &right){
  if(left.second < right.second) return true;
  else return false; 
}
sort(v.begin(), v.end(), comp);  // value 기준으로 오름차순 정렬
 
vector를 순회하며 각각에 대한 누적 합을 acc_vec 벡터에 저장했다. 
 

 

acc_vec 벡터의 누적합은 accumulate() 함수로 구한다. 
  answer = accumulate(acc_vec.begin(), acc_vec.end(), 0); // 마지막 인자는 합의 초기값
 
 
#include <bits/stdc++.h>
using namespace std;

int n, input;
long long accum, answer;
map<int, int> bmap;
vector<int> acc_vec; // 누적합을 저장

bool comp(pair<int,int> &left, pair<int,int> &right){
  if(left.second < right.second) return true;
  else return false; 
}

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;

  for(int i = 1; i <= n; i++){
    cin >> input;
    bmap.insert({i, input});
  }

  vector<pair<int,int>> v(bmap.begin(), bmap.end()); // map -> vector
  sort(v.begin(), v.end(), comp);  // value 기준으로 오름차순 정렬

  for(auto i : v){
    accum += i.second;
    acc_vec.push_back(accum);
  }
  answer = accumulate(acc_vec.begin(), acc_vec.end(), 0); // 마지막 인자는 합의 초기값
  cout << answer;
  return 0;
}
 
 
728x90

+ Recent posts