Advertisement
Guest User

Untitled

a guest
Oct 21st, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <assert.h>
  5. #include <algorithm>
  6. #include <chrono>
  7.  
  8.  
  9. struct Player {
  10.     int number = 0;
  11.     int efficiency = 0;
  12. };
  13.  
  14. bool CompareByEfficiency(const Player& lhs, const Player& rhs) {
  15.     return (lhs.efficiency == rhs.efficiency) ?
  16.         lhs.number < rhs.number : lhs.efficiency < rhs.efficiency;
  17. }
  18.  
  19. bool CompareByNumber(const Player& lhs, const Player& rhs) {
  20.     return (lhs.number == rhs.number) ?
  21.         lhs.efficiency < rhs.efficiency : lhs.number < rhs.number;
  22. }
  23.  
  24. void Merge(std::vector<Player>::iterator first_begin,
  25.                           std::vector<Player>::iterator first_end,
  26.                           std::vector<Player>::iterator second_begin,
  27.                           std::vector<Player>::iterator second_end,
  28.                           std::vector<Player>* merged_vector_destination,
  29.                           bool compare(const Player&, const Player&)) {
  30.  
  31.     while (first_begin < first_end &&
  32.            second_begin < second_end) {
  33.         if (compare(*first_begin, *second_begin)) {
  34.             merged_vector_destination->push_back(*first_begin);
  35.             ++first_begin;
  36.         } else {
  37.             merged_vector_destination->push_back(*second_begin);
  38.             ++second_begin;
  39.         }
  40.     }
  41.     while (first_begin < first_end) {
  42.         merged_vector_destination->push_back(*first_begin);
  43.         ++first_begin;
  44.     }
  45.     while (second_begin < second_end) {
  46.         merged_vector_destination->push_back(*second_begin);
  47.         ++second_begin;
  48.     }
  49. }
  50.  
  51. void Sort(std::vector<Player>::iterator first_player,
  52.           std::vector<Player>::iterator last_player,
  53.           bool compare(const Player&, const Player&) = CompareByEfficiency) {
  54.  
  55.     int64_t vector_size = std::distance(first_player, last_player);
  56.     std::vector<Player> merged;
  57.  
  58.     if (vector_size > 1) {
  59.         Sort(first_player, first_player + vector_size / 2, compare);
  60.         Sort(first_player + (vector_size / 2), last_player, compare);
  61.  
  62.         Merge(first_player, first_player + vector_size / 2,
  63.               first_player + vector_size / 2, last_player,
  64.               &merged,
  65.               compare);
  66.  
  67.         std::copy(merged.begin(), merged.end(), first_player);
  68.         merged.clear();
  69.     }
  70. }
  71.  
  72. int64_t ComputeTeamEfficiency(std::vector<Player> team) {
  73.     int total_team_efficiency = 0;
  74.     for (const auto& player : team) {
  75.         total_team_efficiency += player.efficiency;
  76.     }
  77.     return total_team_efficiency;
  78. }
  79.  
  80. bool IsConsistent(const std::vector<Player>::iterator& team_begin,
  81.                   const std::vector<Player>::iterator& team_end) {
  82.     if (std::distance(team_begin, team_end) < 3) {
  83.         return true;
  84.     }
  85.     return std::prev(team_end)->efficiency <=
  86.            team_begin->efficiency + std::next(team_begin)->efficiency;
  87. }
  88.  
  89. std::vector<Player> FindMostEfficientSolidaryTeam(const std::vector<Player>& all_players) {
  90.     std::vector<Player> sorted_by_efficiency = all_players;
  91.  
  92.     std::sort(sorted_by_efficiency.begin(), sorted_by_efficiency.end(), CompareByEfficiency);
  93.  
  94.     auto current_team_begin = sorted_by_efficiency.begin();
  95.     auto current_team_end = std::next(sorted_by_efficiency.begin());
  96.  
  97.     auto best_team_begin = current_team_begin;
  98.     auto best_team_end = current_team_end;
  99.  
  100.     int64_t current_team_efficiency = sorted_by_efficiency[0].efficiency;
  101.     int64_t best_team_efficiency  = current_team_efficiency;
  102.  
  103.     while (current_team_end < sorted_by_efficiency.end()) {
  104.  
  105.         while (IsConsistent(current_team_begin, current_team_end)) {
  106.  
  107.             if (current_team_efficiency > best_team_efficiency) {
  108.                 best_team_efficiency = current_team_efficiency;
  109.                 best_team_begin = current_team_begin;
  110.                 best_team_end = current_team_end;
  111.             }
  112.  
  113.             if (current_team_end < sorted_by_efficiency.end()) {
  114.                 current_team_efficiency += current_team_end->efficiency;
  115.                 ++current_team_end;
  116.             } else {
  117.                 break;
  118.             }
  119.         }
  120.  
  121.         while (current_team_begin < current_team_end &&
  122.                !IsConsistent(current_team_begin, current_team_end)) {
  123.  
  124.             current_team_efficiency -= current_team_begin->efficiency;
  125.             ++current_team_begin;
  126.         }
  127.  
  128.         if (current_team_efficiency > best_team_efficiency) {
  129.             best_team_efficiency = current_team_efficiency;
  130.             best_team_begin = current_team_begin;
  131.             best_team_end = current_team_end;
  132.         }
  133.     }
  134.  
  135.     std::vector<Player> best_team(best_team_begin, best_team_end);
  136.     std::sort(best_team.begin(), best_team.end(), CompareByNumber);
  137.     return best_team;
  138. }
  139.  
  140. std::vector<Player> LoadAllPlayers() {
  141.     int players_count = 0;
  142.     std::cin >> players_count;
  143.     Player player;
  144.  
  145.     std::vector<Player> all_players;
  146.     for (int player_index = 0; player_index < players_count; ++player_index) {
  147.         player.number = player_index + 1;
  148.         std::cin >> player.efficiency;
  149.         all_players.push_back(player);
  150.     }
  151.  
  152.     return all_players;
  153. }
  154.  
  155. void PrintBestTeam(const std::vector<Player>& team) {
  156.     std::cout << ComputeTeamEfficiency(team) << "\n";
  157.     for (auto player : team) {
  158.         std::cout << player.number << " ";
  159.     }
  160. }
  161.  
  162. int main() {
  163.  
  164.     std::ios_base::sync_with_stdio(false);
  165.     std::cin.tie(nullptr);
  166.  
  167.     auto best_team = FindMostEfficientSolidaryTeam(LoadAllPlayers());
  168.     PrintBestTeam(best_team);
  169.  
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement