fork download
  1.  
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. void print_vec_pair(std::vector<std::pair<int, int>>& v) {
  6.  
  7. for (const auto& a : v) {
  8. std::cout << "(" << a.first << ", " << a.second << ") ";
  9. }
  10. std::cout << std::endl;
  11. }
  12.  
  13. bool compare_pairs(std::pair<int, int>& a, std::pair<int, int>& b) {
  14.  
  15. if (a.second == b.second)
  16. return true;
  17. else
  18. return false;
  19. }
  20.  
  21.  
  22. size_t find_seq_len (std::vector<std::pair<int, int>> & data, size_t start, size_t end) {
  23.  
  24. size_t len = 0;
  25. if (start == end) {
  26. return 1;
  27. }
  28. do {
  29. len++;
  30. } while ( compare_pairs(data[start], data[start+len]) );
  31.  
  32. return len;
  33. }
  34.  
  35. bool is_present(std::vector<std::pair<int, int>>& data, std::pair<int, int>& p) {
  36. if (data.back().first == p.first) {
  37. return true;
  38. }
  39. else {
  40. return false;
  41. }
  42. }
  43.  
  44. std::vector<std::pair<int, int>> decimation(std::vector<std::pair<int, int>>& data, int N) {
  45.  
  46. if (N <= 2 || data.size() == 0) {
  47. return std::vector<std::pair<int, int>>();
  48. }
  49.  
  50. std::vector<std::pair<int, int>> res;
  51.  
  52. for (size_t i = 0; i < data.size(); ) {
  53.  
  54. size_t len = find_seq_len(data, i, data.size() - 1);
  55.  
  56. res.push_back(data[i]);
  57. for (size_t j = 1; j < len; j++) {
  58. if (j % N == 0) {
  59. res.push_back(data[i + j - 1]);
  60. }
  61. }
  62.  
  63. if (is_present(res, data[i + len - 1]) == false) {
  64. res.push_back(data[i + len - 1]);
  65. }
  66.  
  67. i+=len;
  68. }
  69.  
  70. return res;
  71. }
  72.  
  73.  
  74. int main()
  75. {
  76. std::vector<std::pair<int, int>> data;
  77. data.push_back({ 1, 10 });
  78. data.push_back({ 2, 11 });
  79. data.push_back({ 3, 11 });
  80. data.push_back({ 4, 11 });
  81. data.push_back({ 5, 11 });
  82. data.push_back({ 6, 10 });
  83. data.push_back({ 7, 11 });
  84. data.push_back({ 8, 11 });
  85. data.push_back({ 9, 11 });
  86. data.push_back({ 10, 11 });
  87. data.push_back({ 11, 11 });
  88. data.push_back({ 12, 11 });
  89. data.push_back({ 13, 11 });
  90. data.push_back({ 14, 10 });
  91.  
  92. auto result3 = decimation(data, 3);
  93. auto result4 = decimation(data, 4);
  94.  
  95. print_vec_pair(data);
  96. std::cout << std::endl;
  97.  
  98. print_vec_pair(result3);
  99. std::cout << std::endl;
  100.  
  101. print_vec_pair(result4);
  102. std::cout << std::endl;
  103.  
  104. }
Success #stdin #stdout 0s 4540KB
stdin
Standard input is empty
stdout
(1, 10) (2, 11) (3, 11) (4, 11) (5, 11) (6, 10) (7, 11) (8, 11) (9, 11) (10, 11) (11, 11) (12, 11) (13, 11) (14, 10) 

(1, 10) (2, 11) (4, 11) (5, 11) (6, 10) (7, 11) (9, 11) (12, 11) (13, 11) (14, 10) 

(1, 10) (2, 11) (5, 11) (6, 10) (7, 11) (10, 11) (13, 11) (14, 10)