#pragma once

#include <vector>
#include <algorithm>
#include <iostream>
#include <hack/logger/logger.hpp>

namespace alg::tasks
{
  // Есть набор чисел, необходимо из них создать такую перестановку
  // при котором разности их величин будут минимально отличаться.
  // Т.е. как бы максимально их уравнять.
  // Проще говоря:
  // Есть люди разного роста (от 150 см до 190 см) и нужно построить их в шеренгу, чтобы каждый следующий 
  // человек отличался по росту от предыдущего примерно одинаково.
  inline void run_001()
  {
    // { x, y } 
    // x - число
    // y - просто номер чтоб не потеряться когда увидим перестановку
    std::vector<std::pair<int, int>> data { { 1, 0 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 3, 4 }, { 1, 5 }, { 5, 6 }, { 3 , 7 }, { 1, 8 }, { 5, 9 }, { 4, 10 } };

    std::sort(data.begin(), data.end());
    auto n = data.size();

    // работа такая
    // берем четные в порядке возрастания
    for (std::size_t i = 0; i < n; i += 2)
      std::cout << data[i].second << ' ';

    // потом нечетные в порядке убывания
    for (int i = n - 1 - n % 2; i >= 1; i -= 2)
      std::cout << data[i].second << ' ';
    std::cout << std::endl;

    // циферки выводим
    for (std::size_t i = 0; i < n; i += 2)
      std::cout << data[i].first << ' ';

    for (int i = n - 1- n % 2; i >= 1; i -= 2)
      std::cout << data[i].first << ' ';
    std::cout << std::endl;
  }
}

