Матч 305, Мультичтение (MultiRead)

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

 

В компьютерных системах несколько процессов могут одновременно читать данные, но только один процесс может выполнять операцию записи в течение одного такта времени. Строка trace содержит историю работы системы и состоит из символов ‘R’ (чтение) и ‘W’ (запись). Вычислить минимальное время, за которое могут быть произведены все операции procs процессами.

 

Класс: MultiRead

Метод: int minCycles(string trace, int procs)

Ограничения: trace содержит от 1 до 50 символов ‘R’ и ‘W’, 1 £ procs £ 10.

 

Вход. Строка trace и число procs.

 

Выход. Количество тактов времени, за которое может быть выполнена последовательность операций чтения/записи, заданная строкой trace, procs процессами.

 

Пример входа

trace

procs

“RWWRRR”

3

“RWWRRRR”

3

“RRRRRRRRRR”

4

 

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

4

5

3

 

 

 

РЕШЕНИЕ

обработка строк

 

Просматриваем строку trace. При встрече операции записи увеличиваем искомое число тактов времени res на 1. Длину каждой группы из операций чтения заносим в переменную с. с операций чтения можно выполнить procs процессами за временных тактов. Заметим, что

 = (c + procs – 1) / procs,

где деление является целочисленным. Добавим это число к переменной res.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

using namespace std;

 

class MultiRead

{

public:

  int minCycles(string trace, int procs)

  {

    int res, i, c;

    for(res = i = 0; i < trace.size(); i++)

      if (trace[i] == 'W') res++; else

      {

        c = 0; while((trace[i] == 'R') && (i < trace.size())) {c++; i++;} i--;

        res += (c + procs - 1) / procs;

      }

    return res;

  }

};