fork download
  1. #include <iostream>
  2.  
  3. class Buckets
  4. {
  5. private:
  6. int size;
  7. char * buckets;
  8. int calls_to_swap{};
  9. int calls_to_color{};
  10. public:
  11. Buckets(int N) : size{N}, buckets{new char[N]}
  12. {
  13. for (int i{}; i<N; i++)
  14. std::cin >> buckets[i];
  15. }
  16.  
  17. void swap(int i,int j)
  18. {
  19. calls_to_swap++;
  20. std::swap(buckets[i],buckets[j]);
  21. }
  22.  
  23. char color(int i)
  24. {
  25. calls_to_color++;
  26. return buckets[i];
  27. }
  28.  
  29. void calls()
  30. {
  31. std::cout << "Calls to color:\t" << calls_to_color << std::endl
  32. << "Calls to swap:\t" << calls_to_swap << std::endl;
  33. }
  34.  
  35. void print()
  36. {
  37. for (int i{}; i<size;i++)
  38. std::cout << buckets[i] << ' ';
  39. std::cout << std::endl;
  40. }
  41.  
  42. ~Buckets(){ delete[] buckets;}
  43. };
  44.  
  45.  
  46. int main() {
  47.  
  48. int N;
  49. std::cin >> N;
  50. Buckets b{N};
  51. std::cout << "input: ";
  52. b.print();
  53.  
  54. int red{0}; // Элементы массива у которых индекс меньше гарантировано красные
  55. int blue{N-1}; // Элементы массива у которых индекс больше гарантировано синие
  56. int i{};
  57. while (i<blue)
  58. {
  59. switch(b.color(i))
  60. {
  61. case 'r' : b.swap(red,i); red++; i++; break;
  62. case 'w' : i++; break;
  63. case 'b' : b.swap(blue,i); blue--; break;
  64. }
  65. }
  66. std::cout << "output: ";
  67. b.print();
  68. b.calls();
  69.  
  70. return 0;
  71. }
Success #stdin #stdout 0s 3476KB
stdin
15
b b b b b w w w w w r r r r r
stdout
input: b b b b b w w w w w r r r r r 
output: r r r r r w w w w w b b b b b 
Calls to color:	14
Calls to swap:	10