fork download
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. //////////////////////////////////////////////////////////////////
  6. // Ищем произведение элементов массива, которые расположены между
  7. // максимальным и минимальным элементами
  8. //
  9. // Дополнительно (чего не уточнено в задании):
  10. //
  11. // 1. Не ищем в обратном порядке (от минимального к максимальному)
  12. // 2. Возможные варианты заносим в вектор результатов и их
  13. // разновсячески сортируем в порядке нужного
  14. //////////////////////////////////////////////////////////////////
  15.  
  16. typedef std::pair<std::size_t,std::size_t> PairType;
  17. typedef std::vector<PairType> ResType;
  18.  
  19. void FuncMul(std::vector<int> Vec, ResType &Res) {
  20. // в векторе длиной меньше 3-х искать нечего
  21. if (Vec.size()<3) throw std::runtime_error("ничего не найдено");
  22. // определяемся с минимумами и максимумами
  23. auto Min = *std::min_element(Vec.begin(),Vec.end());
  24. auto Max = *std::max_element(Vec.begin(),Vec.end());
  25. // ищем все пары мах-min
  26. std::size_t I = 0, S = Vec.size(), X;
  27. int M = 0;
  28. while(I<S) {
  29. if (M == 0) {
  30. if (Vec[I]==Max) { M=1; X=I; }
  31. } else {
  32. if (Vec[I]==Min) {
  33. if (I>X+1) Res.push_back({X,I});
  34. M=0;
  35. } else if (Vec[I]==Max) X=I;
  36. }
  37. I++;
  38. }
  39. if(Res.size()<1) throw std::runtime_error("ничего не найдено");
  40. }
  41.  
  42. int main() {
  43. std::vector<int> Vec = {3,-4,1,3,4,9,1,-4,9,9,2,-3,-4,9,1};
  44. ResType Res;
  45. try {
  46. FuncMul(Vec,Res);
  47. // лямбда вывода на печать
  48. auto PrnPair = [&](const PairType &P) {
  49. std::cout << P.first << ":" << P.second << " = " <<
  50. std::accumulate(Vec.begin()+P.first+1, Vec.begin()+P.second, 1, std::multiplies<int>()) <<
  51. std::endl;
  52. };
  53. // лямбда сортировки по величине произведения
  54. auto SortMul = [&] (const PairType &P1, const PairType &P2) {
  55. return std::accumulate(Vec.begin()+P1.first+1, Vec.begin()+P1.second, 1, std::multiplies<int>()) <
  56. std::accumulate(Vec.begin()+P2.first+1, Vec.begin()+P2.second, 1, std::multiplies<int>());
  57. };
  58. // лямбда сортировки по количеству множимых
  59. auto SortDis = [&] (const PairType &P1, const PairType &P2) {
  60. return P1.second - P1.first < P2.second-P2.first;
  61. };
  62. // 1) печать "сырого" несортированного результата --------------------------------------------
  63. for(const auto &i:Res) PrnPair(i);
  64. std::cout << "=========================" << std::endl;
  65. // 2) печать отсортированного результата по возрастанию величины произведения ----------------
  66. std::sort(Res.begin(),Res.end(),SortMul);
  67. for(const auto &i:Res) PrnPair(i);
  68. std::cout << "=========================" << std::endl;
  69. // 3) печать отсортированного результата по убыванию количества элементов в произведении ----
  70. std::sort(Res.begin(),Res.end(),SortDis);
  71. for(const auto &i:Res) PrnPair(i);
  72. std::cout << "=========================" << std::endl;
  73. } catch(std::runtime_error &E) {
  74. std::cout << "Ошибка: " << E.what() << std::endl;
  75. } catch(...) {
  76. std::cout << "Ошибка: что-то пошло не так!" << std::endl;
  77. }
  78. return 0;
  79. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
5:7 = 1
9:12 = -6
=========================
9:12 = -6
5:7 = 1
=========================
5:7 = 1
9:12 = -6
=========================