Матч 404, Чтение книг (ReadingBooks)

Дивизион 2, Уровень 1

 

Каждая книга состоит из трех частей: вступление (“introduction”), основная часть (“story”) и наставление (“edification”). Когда читатель заканчивает прочтение какой-либо части, он заносит ее название в список. Из книги можно читать любое количество частей (даже 0) и в любом порядке. Но одну и туже часть из одной книги читать нельзя. Возвращаться к прочитанным книгам нельзя.

Массив строк readParts содержит список прочитанных частей книг. Вернуть наибольшее количество книг, в которых могли быть прочитаны все три части.

 

Класс: ReadingBooks

Метод: int countBooks(vector<string> readParts)

Ограничения: readParts содержит от 1 до 50 элементов, readParts[i] содержит “introduction”, “story” или “edification”.

 

Вход. Список прочитанных частей книг readParts.

 

Выход. Наибольшее количество книг, в которых могли быть прочитаны все три части.

 

Пример входа

readParts

{"introduction", "story", "introduction", "edification"}

{"introduction", "story", "edification", "introduction", "story", "edification"}

{"introduction", "story", "introduction", "edification", "story",

"story", "edification", "edification", "edification", "introduction",

"introduction", "edification", "story", "introduction", "story",

"edification", "edification", "story", "introduction", "edification",

"story", "story", "edification", "introduction", "story"}

 

Пример выхода

1

2

5

 

 

РЕШЕНИЕ

перебор

 

Главы readParts[i], readParts[i + 1] и readParts[i + 2] могут принадлежать одной книге, если они попарно разные. Просматриваем список частей прочитанных книг слева направо. Если очередные три стоящие рядом части с номерами i, i + 1 и i + 2 разные, то увеличиваем результат res на 1. После чего продолжаем процесс просмотра частей, начиная с i + 3 - ей.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

using namespace std;

 

class ReadingBooks

{

public:

  int countBooks(vector<string> readParts)

  {

    int i, res;

    if(readParts.size() < 3) return 0;

    for(res = i = 0; i < readParts.size() - 2; i++)

      if ((readParts[i] != readParts[i+1]) &&

          (readParts[i+1] != readParts[i+2]) &&

          (readParts[i+2] != readParts[i])) res++, i += 2;

    return res;

  }

};