Помогите с задачкой C++
Дана цепочка, состоящая из синих (B) и красных (R) точек. Нужно удалить наименьшее одинаковое количество синих и красных точек так, чтобы сначала шли только синие, а потом – только красные.
Входные данные
Входная строка содержит только символы 'B' и 'R' без пробелов.
Выходные данные
Нужно вывести полученную цепочку, в которой сначала идут только синие точки, а потом – только красные. Во второй строке нужно вывести количество удалённых (синих и красных) точек.
Примеры
входные данные
BBBRBBRBRBRRRRRR
выходные данные
BBBBBRRRRRRR
4
Вот решение данной задачи:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int count_b = 0, count_r = 0; // счетчики количества синих и красных точек
int pos_b = -1, pos_r = -1; // позиции первой красной и первой синей точек, если они есть
// определяем позиции первой красной и первой синей точек
for (int i = 0; i < s.length(); i++) {
if (s[i] == 'B' && pos_b == -1) {
pos_b = i;
} else if (s[i] == 'R' && pos_r == -1) {
pos_r = i;
}
}
// если первая точка - красная, меняем местами позиции
if (pos_r < pos_b) {
int tmp = pos_r;
pos_r = pos_b;
pos_b = tmp;
}
// удаляем лишние точки
for (int i = pos_b; i < s.length(); i++) {
if (s[i] == 'B') {
count_b++;
} else {
count_r++;
}
if (count_r > count_b) {
s.erase(i, 1);
i--;
count_r--;
}
}
// выводим результат
cout << s << endl;
cout << count_r + count_b << endl;
return 0;
}
Краткое описание алгоритма:
Определяем позиции первой красной и первой синей точек в цепочке.
Если первая точка - красная, меняем местами позиции.
Проходим по цепочке и подсчитываем количество синих и красных точек. Если количество красных точек становится больше, чем количество синих, удаляем лишнюю точку (красную).
Выводим результат - измененную цепочку и количество удаленных точек.