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

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


 

Треугольник Максима

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

Для поиска решения в процессе последовательного чтения данных следует сужать частотный отрезок поиска [min, max], который первоначально можно положить равным [30, 4000]. На каждом шаге мы имеем некоторую текущую частоту T, а также знаем ближе или дальше она по звучанию предыдущей ноты P. Анализируя это, мы можем уменьшить отрезок поиска, если средняя точка X находится между T и P, здесь X=(T+P)/2.

Рассмотрим всевозможные варианты, которые могут возникнуть при сравнении предыдущей и текущей частоты:

  • P = T, результат сравнения любой (на самом деле, ни один из возможных не подходит) - в данном случае эта информация не уточняет частотный отрезок и не подразумевает каких-либо действий;
  • P < T, результат closer - частота не меньше X и в случае, когда min < X нужно min присвоить X;
  • P < T, результат further - частота не больше X и в случае, когда max > X нужно max присвоить X;
  • P > T, результат closer - частота не больше X и в случае, когда max > X нужно max присвоить X;
  • P > T, результат further - частота не меньше X и в случае, когда min < X нужно min присвоить X;

В результате обработки всех частот в качестве ответа следует вывести полученный отрезок [min, max]. Заметим, что в качестве переменных здесь следует использовать вещественные числа, поддерживающие точность до 10 знаков.

Алгоритмическая реализация вышеописанной идеи:

  min = 30; max = 4000
  read(P)
  for i = 1..n-1{
    read(T, s)
    X = (P + T) / 2
    if(s == ' closer'){
      if(T > P && min < X) min = X
      if(T < P) and (max > X) max = X
    }else{
      if(T < P) and (min < X) min = X
      if(T > P) and (max > X) max = X
    }
    P = T
  }
  write(min, ' ', max)

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


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