Advertisement
Sanlover

Untitled

Dec 22nd, 2021
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <iomanip>
  4. using namespace std;
  5.  
  6. size_t getBalons(const size_t& length, const size_t& amount)
  7. {
  8. size_t result = 0;
  9. result = length / amount;
  10. if (result == 0)
  11. {
  12. return 1;
  13. }
  14. if (amount * result < length)
  15. {
  16. result += 1;
  17. }
  18. return result;
  19. }
  20.  
  21. using elements_t = vector<size_t>;
  22.  
  23. elements_t combo;
  24. vector<elements_t> combos;
  25.  
  26. void calculateCombinations(const elements_t& numbers, size_t size)
  27. {
  28. for (size_t i = 0; i < numbers.size(); i++)
  29. {
  30. combo.push_back(numbers[i]);
  31. if (size <= 1)
  32. {
  33. combos.push_back(combo);
  34. combo.erase(combo.end() - 1);
  35. }
  36. else
  37. {
  38. calculateCombinations(numbers, size - 1);
  39. combo.erase(combo.end() - 1);
  40. }
  41. }
  42. }
  43.  
  44. int main()
  45. {
  46. elements_t a;
  47. size_t N, M, K;
  48. cin >> N >> M >> K;
  49. a.resize(N);
  50. for (size_t i = 0; i < N; i++)
  51. {
  52. cin >> a[i];
  53. }
  54.  
  55. const elements_t variants = {0, 1};
  56. const size_t size = N - 1;
  57. elements_t line;
  58. // берём отрезок
  59.  
  60. size_t startBalons = 0;
  61. // берём элемент отрезка
  62. for (auto& jt : a)
  63. {
  64. startBalons += getBalons(jt, K);
  65. }
  66. cout << "start balons = " << startBalons << endl;
  67.  
  68. size_t* minBalons = nullptr;
  69. vector<elements_t> minSplit;
  70. calculateCombinations(variants, size);
  71. for (size_t i = 0; i < combos.size(); i++)
  72. {
  73. vector<elements_t> current_a_split(N);
  74. /// 00000001
  75. size_t id = 0;
  76. current_a_split[id].push_back(a[0]);
  77. for (size_t j = 0; j < combos[i].size(); j++)
  78. {
  79. if (combos[i][j] == 0)
  80. {
  81. id++;
  82. }
  83. current_a_split[id].push_back(a[j + 1]);
  84. }
  85. size_t balons = 0;
  86. // берём отрезок
  87. bool isFit = true;
  88. for (auto& it : current_a_split)
  89. {
  90. if (it.size() > M)
  91. {
  92. isFit = false;
  93. break;
  94. }
  95. if (!it.empty())
  96. {
  97. size_t split_length = 0;
  98. // берём элемент отрезка
  99. for (auto& jt : it)
  100. {
  101. split_length += jt;
  102. }
  103.  
  104. balons += getBalons(split_length, K);
  105. }
  106. }
  107. if (isFit)
  108. {
  109. if (minBalons == nullptr)
  110. {
  111. minBalons = new size_t(balons);
  112. minSplit = current_a_split;
  113. }
  114. else
  115. {
  116. if (*minBalons > balons)
  117. {
  118. *minBalons = balons;
  119. minSplit = current_a_split;
  120. }
  121. }
  122. }
  123. }
  124. size_t P = 1;
  125. vector<pair<size_t, size_t>> pIds;
  126. for (auto it = minSplit.begin(); it != minSplit.end(); ++it)
  127. {
  128. if (it->size() > 1)
  129. {
  130. pIds.push_back(pair<size_t, size_t>(P, it->size()));
  131. P += it->size();
  132. }
  133. }
  134. cout << endl << "Min split has parameters:" << endl;
  135. cout << "elements = ";
  136. for (auto& it : minSplit)
  137. {
  138. // берём элемент отрезка
  139. for (auto& jt : it)
  140. {
  141. cout << setw(2) << jt;
  142. }
  143. cout << "-";
  144. }
  145. cout << endl << startBalons - *minBalons << endl << pIds.size() << endl;
  146. for (size_t i = 0; i < pIds.size(); i++)
  147. {
  148. cout << pIds[i].first << " " << pIds[i].second << endl;
  149. }
  150. return 0;
  151. }
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement