제출 #1169308

#제출 시각아이디문제언어결과실행 시간메모리
1169308LucaLucaM선물상자 (IOI15_boxes)C++20
0 / 100
0 ms328 KiB
#include "boxes.h"
#include <vector>
#include <algorithm>
#include <iostream>

#define debug(x) #x << " = " << x << '\n'

long long delivery(int n, int k, int L, int p[]) {
  std::vector<std::pair<int, int>> v(n);
  for (int i = 0; i < n; i++) {
    v[i].first = std::min(p[i], L - p[i]);
    v[i].second = p[i];
  } 

  std::sort(v.begin(), v.end());
  std::reverse(v.begin(), v.end());

  long long answer = 0;

  std::vector<int> st, dr;
  for (int i = 0; i < n; i++) {
    if (v[i].first == v[i].second) {
      st.push_back(v[i].first);
    } else {
      dr.push_back(v[i].first);
    }
  }

  std::sort(st.begin(), st.end());
  std::sort(dr.begin(), dr.end());

  while (!st.empty() && !dr.empty() && 2 * std::max(st.back(), dr.back()) >= L) {
    answer += L;
    for (int i = 0; i < std::min(n, k); i++){ 
      if (v.back().first == v.back().second) {
        st.pop_back();
      } else {
        dr.pop_back();
      }
      v.pop_back();
    }
    n = std::max(0, n - k);
  }

  while (!st.empty()) {
    answer += 2 * st.back();
    for (int i = 0; i < k && !st.empty(); i++) {
      st.pop_back();
    }
  }

  while (!dr.empty()) {
    answer += 2 * dr.back();
    for (int i = 0; i < k && !dr.empty(); i++) {
      dr.pop_back();
    }
  }

  return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...