Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 

Клавиатура - 2

(Время: 1 сек. Память: 16 Мб Сложность: 25%)

Для решения этой задачи следует завести целочисленный массив a[1..n], где в a[i] будет храниться максимальное число нажатий, которое выдерживает i-я клавиша. После чего достаточно будет один раз пройтись по последовательности нажатий клавиш. Рассматривая текущее нажатие клавиши x, будем соответственно уменьшать число оставшихся нажатий в a[x]. По завершению этого процесса в каждом a[i] будет храниться число нажатий, которые i-я клавиша еще способна выдержать, если это значение отрицательно, то следует вывести "yes", иначе - "no".

Описанный выше алгоритм представим следующим образом:

  int a[1..100];
  //чтение данных
  read(n);
  for i=1..n read(a[i]);
  read(k);
  for i=1..k{
    read(x);           //чтение номера нажатой клавиши
    a[x]=a[x]-1;       //уменьшаем на единицу остаток нажатий, которые еще может выдержать эта клавиша
  }
  //вывод результата
  for i=1..n
    if(a[i]<0) writeln('yes') 
          else writeln('no');

Рассмотренное выше решение имеет линейный порядок сложности O(N+K) и поэтому вполне приемлемо. Здесь могло бы пройти даже решение порядка O(N*K). Речь идет о следующем: если использовать дополнительный массив, в котором хранить всю последовательность из K нажатий и для определения устойчивости каждой клавиши в отдельности пробегать по этому массиву и считать число нажатий конкретной клавиши, то в принципе мы получим верный алгоритм, но весьма более затратный по времени.

[Обсуждение] [Все попытки] [Задача]


Красноярский краевой Дворец пионеров, (c)2006 - 2025, ИНН 246305493507, E-mail: admin@acmp.ru



красное пламя в газовой плите