На спутнике «Фотон» установлен прибор, предназначенный для измерения энергии космических лучей. Каждую минуту прибор передаёт по каналу связи неотрицательное вещественное число – количество энергии, полученной за последнюю минуту, измеренное в условных единицах. Временем, в течение которого происходит передача, можно пренебречь.
Необходимо найти в заданной серии показаний прибора минимальное произведение двух показаний, между моментами передачи которых прошло не менее 6 минут. Количество энергии, получаемое прибором за минуту, не превышает 1000 условных единиц. Общее количество показаний прибора в серии не превышает 10000.
Напишите на любом языке программирования программу для решения поставленной задачи. Ваша оценка будет зависеть не только от правильности программы, но и от того, насколько она эффективна.
Перед программой укажите версию языка и кратко опишите использованный алгоритм.
В первой строке задаётся число N – общее количество показаний прибора. Гарантируется, что N> 6. В каждой из следующих N строк задаётся одно неотрицательное вещественное число – очередное показание прибора.
Пример входных данных:
11
12
45
5
4
25
23
21
20
10
12
26
Программа должна вывести одно число – описанное в условии произведение.
Пример выходных данных для приведённого выше примера входных данных:
48
Объяснение
Нам необходимо найти минимальное допустимое произведение. В программе будем хранить последние 6 значений в массиве (mas), минимальное значение (min_number) и минимальное произведение (min_comp). Так как число элементов в массиве фиксировано, то программа является эффективной по памяти. Сначала введем первые 6 элементов в массив. Затем, при вводе очередного значения (a), сначала сравниваем элемент стоящий 6 номеров назад с минимальным значением (min_number), а потом сравниваем min_number * a и min_comp (результат). В конце каждого цикла заменяем в массиве элемент стоящий 6 номеров назад на a. Выводим результат (min_comp).
Примечание: В языке Python вещественный тип данных (float) обязательно имеет точку, поэтому, если произведение получилось целым, нам надо вывести его как целое (например: 48, а не 48.0). Поэтому в конце программы необходимо сделать проверку и вывести тот ответ, который необходим в этой ситуации.
Решение на языке Паскаль
Показать решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
const k = 6; //Необходимое расстояние между элементами var mas: array[0..k - 1] of real; //Последние k элементов N: word; //Количество элементов a: real; //Очередное значение min_comp: real; //Минимальное произведение (Ответ) min_number: real; //Минимальное число c: word; //Вспоммогательная переменная begin min_number := 1001; min_comp := 1001 * 1001; readln(N); for var i := 0 to k - 1 do readln(mas[i]); for var i := k to N - 1 do begin c := i mod k; readln(a); if mas[c] < min_number then min_number := mas[c]; if min_number * a < min_comp then min_comp := min_number * a; mas[c] := a; end; writeln(min_comp) end. |
Решение на языке Python
Показать решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
k = 6 min_comp = 1001 * 1001 min_number = 1001 c = 0 N = int(input()) mas = [float(input()) for i in range(k)] for i in range(k, N): c = i % k a = float(input()) if mas[c] < min_number: min_number = mas[c] if min_number * a < min_comp: min_comp = min_number * a mas[c] = a if min_comp.is_integer(): print(int(min_comp)) else: print(min_comp) |