Форум » Обработка числовых последовательностей » Задача 27. Номер 31. » Ответить

Задача 27. Номер 31.

Полина: Условие. В физической лаборатории проводится долговременный эксперимент по изучению гравитационного поля Земли. По каналу связи каждую минуту в лабораторию передаётся положительное целое число – текущее показание прибора «Сигма 2015». Количество передаваемых чисел в серии известно и не превышает 10 000. Все числа не превышают 1000. Временем, в течение которого происходит передача, можно пренебречь. Необходимо вычислить «бета-значение» серии показаний прибора – минимальное чётное произведение двух показаний, между моментами передачи которых прошло не менее 6 минут. Если получить такое произведение не удаётся, ответ считается равным –1. Задача А. Напишите программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Максимальная оценка за выполнение задания А – 2 балла. Задача Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик). Входные данные представлены следующим образом. В первой строке задаётся число N – общее количество показаний прибора. Гарантируется, что N > 6. В каждой из следующих N строк задаётся одно положительное целое число – очередное показание прибора. Пример входных данных: 11 12 45 5 3 17 23 21 20 19 18 17 Программа должна вывести одно число – описанное в условии произведение либо –1, если получить такое произведение не удаётся. Пример выходных данных для приведённого выше примера входных данных: 54 Ответ. Задача Б. const s = 6; {требуемое расстояние между показаниями} amax = 1001; {больше максимально возможного показания} var N, p, i: integer; a: array[1..10000] of integer; {все показания прибора} ma: integer; {минимальное число без s последних} me: integer; {минимальное чётное число без s последних} mp: integer; {минимальное значение произведения} begin readln(N); {Ввод всех показаний прибора} for i:=1 to N do readln(a); ma := amax; me := amax; mp := amax*amax; for i := s + 1 to N do begin if a[i-s] < ma then ma := a[i-s]; if (a[i-s] mod 2 = 0) and (a[i-s] < me) then me := a[i-s]; if a mod 2 = 0 then p := a * ma else if me < amax then p := a * me else p := amax * amax; if (p < mp) then mp := p end; if mp = amax*amax then mp := -1; writeln(mp) end. ---- Хотелось бы спросить, почему в решении задачи Б программа, неэффективная по памяти? Там же вводится массив на 10000 элементов, которые занимают много. К тому же в условии не было написано, что количество обязательно равно 10000. Оно равно введённому N. Разве нет? Где я ошиблась? И ещё когда читается весь этот поток данных, они же в массив записываются, что ещё раз говорит о том, что тратится много места.

Ответов - 4

Поляков: Полина пишет: Хотелось бы спросить, почему в решении задачи Б программа, неэффективная по памяти? Эта программа неэффективна по памяти, она на 3 балла, потому что эффективна по времени. И авторы об этом прямо пишут.

Полина: Теперь поняла, я просто привыкла, что ответы на задачу Б в 27 всегда эффективны и по памяти и по времени. Только тут просто задачи беру и ответы на них тоже :)

AQUA: Программа ниже на C++ оценивается в 4 балла? #include "stdafx.h" #include <iostream> using namespace std; int main() { int N, j, x, mp = 10000000; /mp минимальное произведение int a[6]; cin >> N; for (j = 0;j < 6;j++) cin >> a[j]; for (j = 6;j < N;j++) { cin >> x; if (x*a[0] < mp && (x*a[0]) % 2 == 0) mp = x*a[0]; a[0] = a[1]; a[1] = a[2]; a[2] = a[3]; a[3] = a[4]; a[4] = a[5]; a[5] = x; } if (mp != 10000000) cout << mp; else cout << -1; return 0; }


Поляков: AQUA пишет: Программа ниже на C++ оценивается в 4 балла? Да.



полная версия страницы