Матч
346, Охота за бриллиантами (DiamondHunt)
Дивизион 2,
Уровень 1
Имеется строка, содержащая
символы ‘<’ и ‘>’. Каждая подстрока вида “<>”является бриллиантом.
Когда в строке обнаруживается бриллиант, то последовательность
“<>”удаляется из нее. Продолжаем процесс обнаружения и удаления
бриллианта из строки до тех пор, пока это можно сделать. В задаче требуется
подсчитать количество найденных таким образом бриллиантов.
Класс: DiamondHunt
Метод: int
countDiamonds(string mine)
Ограничения:
mine содержит от 1 до 50 символов ‘<’ и ‘>’.
Вход. Строка mine, состоящая из символов ‘<’ и ‘>’.
Выход. Количество бриллиантов, найденных в строке mine указанным
способом.
Пример входа
mine |
"><<><>>><" |
">>>><<" |
"<<<<<<<<<>>>>>>>>>" |
Пример выхода
3
0
9
РЕШЕНИЕ
обработка строк
Для решения задачи можно промоделировать
процесс поиска и удаления бриллиантов при помощи строковых функций. Но поступим
иначе. В переменной depth будем подсчитывать
количество открывающихся скобок ‘<’. Если встречается закрывающаяся скобка ‘>’
и значение переменной depth на
текущий момент больше нуля, то символ ‘>’ обязательно образует бриллиант в
какой-нибудь момент времени. В этом случае количество найденных бриллиантов
увеличим на 1, а значение depth
уменьшим на 1.
ПРОГРАММА
#include <cstdio>
#include <string>
using namespace std;
class DiamondHunt
{
public:
int countDiamonds(string mine)
{
int res, i, depth;
for(depth = res = i = 0; i <
mine.size(); i++)
{
if (mine[i] == '<')
depth++;
else if
(depth > 0) depth--, res++;
}
return res;
}
};