Top.Mail.Ru
Ответы

Помогите с задачкой 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;
}

Краткое описание алгоритма:

  1. Определяем позиции первой красной и первой синей точек в цепочке.

  2. Если первая точка - красная, меняем местами позиции.

  3. Проходим по цепочке и подсчитываем количество синих и красных точек. Если количество красных точек становится больше, чем количество синих, удаляем лишнюю точку (красную).

  4. Выводим результат - измененную цепочку и количество удаленных точек.