Матч 1, Радар скорости (SpeedRadar)

 

Радар расположен на шоссе для фиксирования скоростей проезжающих автомобилей. Скорость машин должна быть не менее minLimit и не более maxLimit. Любая другая скорость является нарушением.

Периодически проверяется корректность работы радара. Считая, что водители соблюдают скорость движения, радар является неисправным, если более 10% зафиксированных им скоростей находится все интервала [minLimit; maxLimit].

Вычислить среднюю скорость движения машин, или вернуть 0.0, если радар неисправен.

 

Класс: SpeedRadar

Метод: double averageSpeed(int minLimit, int maxLimit,

                           vector <int> readings)

Ограничения: 1 £ maxLimit £ 200, 1 £ minLimit £ maxLimit, readings содержит от 1 до 50 элементов, 1 £ readings[i] £ 200. Результат должен иметь точность порядка 10-9.

 

Вход. Наименьшая minLimit и наибольшая maxLimit скорость автомобиля, распознаваемая радаром. Масив readings содержит  скорости машин, зафиксированных радаром.

 

Выход. Средняя скорость движения машин. Если радар неисправен, то вернуть 0.0.

 

Пример входа

minLimit

maxLimit

readings

1

50

{45, 40, 50}

1

50

{42,43,44,45,46,47,48,49,50,51}

1

50

{42,46,48,50,52}

 

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

45.0

46.0

0.0

 

 

РЕШЕНИЕ

элементарные вычисления

 

Подсчитываем в переменной ave среднее арифметическое скоростей, зафиксированных радаром, попадающих в промежуток [minLimit; maxLimit]. В переменной c подсчитываем количество скоростей из промежутка [minLimit; maxLimit]. Пусть s – количество наблюдений. Если радар неисправный (10 * c < 9 * s), то возвращаем 0.0, иначе – среднюю скорость движения машин.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

class SpeedRadar

{

public:

  double averageSpeed(int minLimit, int maxLimit, vector <int> readings)

  {

    int ave, i, c, s = readings.size();

    for(ave = c = i = 0; i < readings.size(); i++)

      if ((readings[i] >= minLimit) && (readings[i] <= maxLimit))

          ave += readings[i], c++;

    if (10 * c < 9 * s) return 0.0;

    return 1.0 * ave / c; 

  }

};