Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. struct Player;
  6. bool CompPower(Player fir, Player sec);
  7. bool CompNumbers(Player fir, Player sec);
  8. void PrintNums(std::vector<Player> data, int left, int right);
  9. void Merge(std::vector<Player> &res, int ii, int jj, int mm, bool comp(Player, Player));
  10. void MergeSort(std::vector<Player> &data, int ii, int jj, bool comp(Player, Player));
  11.  
  12. struct Player {
  13.     int64_t power;
  14.     int num;
  15. };
  16.  
  17. bool CompPower(Player fir, Player sec) {
  18.     return fir.power <= sec.power;
  19. }
  20.  
  21. bool CompNumbers(Player fir, Player sec) {
  22.     return  fir.num <= sec.num;
  23. }
  24.  
  25. void PrintNums(std::vector<Player> data, int left, int right) {
  26.  
  27.     for (int k = left; k <= right; ++k) {
  28.         std::cout << data[k].num << ' ';
  29.     }
  30. }
  31.  
  32. void Merge(std::vector<Player> &res, int ii, int jj, int mm, bool comp(Player, Player)) {
  33.  
  34.     std::vector<Player> left(mm - ii + 1), right(jj - mm);
  35.     std::copy(res.begin() + ii, res.begin() + mm + 1, left.begin());
  36.     std::copy(res.begin() + mm + 1, res.begin() + jj + 1, right.begin());
  37.     int r_ind  = 0, l_ind = 0, res_ind = ii;
  38.     int r_size = right.size(), l_size = left.size();
  39.     while (r_ind < r_size && l_ind < l_size) {
  40.         if (comp(left[l_ind] , right[r_ind])) {
  41.             res[res_ind] = left[l_ind];
  42.  
  43.             ++l_ind;
  44.         } else {
  45.             res[res_ind] = right[r_ind];
  46.             ++r_ind;
  47.         }
  48.         ++res_ind;
  49.     }
  50.     while (l_ind < l_size) {
  51.         res[res_ind] = left[l_ind];
  52.         ++res_ind;
  53.         ++l_ind;
  54.     }
  55.     while (r_ind < r_size) {
  56.         res[res_ind] = right[r_ind];
  57.         ++res_ind;
  58.         ++r_ind;
  59.     }
  60. }
  61.  
  62. void MergeSort(std::vector<Player> &data, int ii, int jj, bool comp(Player, Player) ) {
  63.     if (ii < jj) {
  64.         int middle =  ii + (jj - ii) / 2;
  65.         MergeSort(data, ii, middle, comp);
  66.         MergeSort(data, middle + 1, jj, comp);
  67.         Merge(data, ii, jj, middle, comp);
  68.     }
  69. }
  70.  
  71. int main() {
  72.     int nn, inp;
  73.     std::cin >> nn;
  74.     std::vector<Player> data(nn);
  75.     for (int i = 0; i < nn; ++i) {
  76.         std::cin >> inp;
  77.         data[i].power = inp;
  78.         data[i].num = i + 1;
  79.     }
  80.     MergeSort(data, 0, nn - 1, CompPower);
  81.     int left = 0, right = 0;
  82.     int64_t sum = data[0].power, max_sum = data[0].power;
  83.     while (right < nn - 1) {
  84.         if (data[right + 1].power <= data[left].power + data[left + 1].power) {
  85.             sum += data[right + 1].power;
  86.             ++right;
  87.         } else {
  88.             max_sum = std::max(sum, max_sum);
  89.             sum -= data[left].power;
  90.             ++left;
  91.         }
  92.     }
  93.     max_sum = std::max(sum, max_sum);
  94.     std::cout << max_sum << '\n';
  95.     MergeSort(data, left, right, CompNumbers);
  96.     PrintNums(data, left, right);
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement