Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <utility>
  4. #include <algorithm>
  5.  
  6. void Read(std::vector<std::pair<int, int>>* rates) {
  7.     size_t size;
  8.     std::cin >> size;
  9.     rates->reserve(size);
  10.     for (size_t it = 0; it < size; ++it) {
  11.         int curr_rate;
  12.         std::cin >> curr_rate;
  13.         rates->emplace_back(curr_rate, it + 1);
  14.     }
  15.     std::sort(rates->begin(), rates->end());
  16.     std::reverse(rates->begin(), rates->end());
  17. }
  18.  
  19. int64_t GetBestTeam(const std::vector<std::pair<int, int>>& rates, std::vector<int>* result) {
  20.     size_t left = 0;
  21.     int64_t sum = static_cast<int64_t>(rates[0].first) + static_cast<int64_t>(rates[1].first);
  22.     int64_t max_sum = sum;
  23.     size_t max_left = 0;
  24.     size_t max_right = 1;
  25.     for (size_t right = 2; right < rates.size(); ++right) {
  26.         while (right >= left + 2 &&
  27.         static_cast<int64_t>(rates[right].first) + static_cast<int64_t>(rates[right - 1].first)
  28.         < rates[left].first) {
  29.             sum -=rates[left].first;
  30.             ++left;
  31.         }
  32.         sum += rates[right].first;
  33.         if (sum > max_sum) {
  34.             max_sum = sum;
  35.             max_left = left;
  36.             max_right = right;
  37.         }
  38.     }
  39.     result->reserve(max_right - max_left + 1);
  40.     for (size_t it = max_left; it <= max_right; ++it) {
  41.         result->push_back(rates[it].second);
  42.     }
  43.     std::sort(result->begin(), result->end());
  44.     return max_sum;
  45. }
  46.  
  47. int main() {
  48.     std::vector<std::pair<int, int>> rates;
  49.     std::vector<int> result;
  50.     Read(&rates);
  51.     if (rates.size() == 1) {
  52.         std::cout << rates[0].first << '\n';
  53.         std::cout << 1;
  54.         return 0;
  55.     }
  56.     auto max_rate = GetBestTeam(rates, &result);
  57.     std::cout << max_rate << '\n';
  58.     for (auto elem : result) {
  59.         std::cout << elem << ' ';
  60.     }
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement