Матч 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;
}
};