Математика ЕГЭ
Русский язык ЕГЭ
Математика 5-7
Математика ОГЭ
Информатика
Физика
Обществознание
Кликните, чтобы открыть меню

27. Программирование – оптимизация по времени и по памяти

1. Вспоминай формулы по каждой теме
2. Решай новые задачи каждый день
3. Вдумчиво разбирай решения

Пары на заданном расстоянии (страница 2)

Задание 8 #12284

Муравьед не знает, что такое среднее арифметическое, но ему срочно необходимо найти в заданной последовательности неотрицательных чисел минимальное среднее арифметическое двух ее элементов, номера которых различаются не менее, чем на 4. Известно, что значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000. Напишите такую программу для Муравьеда, чтобы он смог справиться со своей задачей.

Вам предлагаются два задания, связанные с этой задачей: задание А и задание Б. Вы можете решать оба задания А и Б или одно из них по своему выбору. Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание составляет 0 баллов. Задание Б является усложненным вариантом задания А, оно содержит дополнительные требования к программе.

А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования. Обязательно укажите, что программа является решением задания А. Максимальная оценка за выполнение задания А — 2 балла.

Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности \(N\), т.е. при увеличении \(N\) в \(k\) раз время работы программы должно увеличиваться не более чем в \(k\) раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа \(N\) и не превышает 1 килобайта. Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.

Максимальная оценка за правильную программу, эффективную по времени и по памяти — 4 балла. Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.

Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Входные данные представлены следующим образом. В первой строке задаётся число \(N\) — общее количество элементов последовательности. Гарантируется, что \(N > 4\). В каждой из следующих \(N\) строк задаётся одно неотрицательное целое число — очередной элемент последовательности.

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

10

100

45

55

10

35

25

10

10

10

26

Программа должна вывести одно число — описанное в условии произведение. Пример выходных данных для приведённого выше примера входных данных: 10.

Для упрощения решения задачи можно заметить, что минимальное среднее арифметическое есть минимальная сумма двух элементов на заданном расстоянии, поделенная на два. Поэтому при решении задачи просто будем выводить на экран минимальную сумму, раздлеенную на два.

Также возможно вычисление среднего арефметического в ходе решения задачи, это никак не влияет на результат.

Задание А.

Приведем одно из возможных решений задания А на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N; // \text{вводим размер массива N, не превышающий 10000}\\ \quad int\; a[10000]; // \text{создаем массив на 10000 элементов (максимальное возможное количество элементов по условию)}\\ \quad float\; min = 2001; // \text{создаем переменную для минимума}\\ \\ \quad for\; (int\; i = 0; i < N; i++) // \text{вводим массив}\\ \quad \quad cin >> a[i];\\ \\ \quad for\; (int\; i = 0; i < N; i++) \\ \quad \quad for\; (int\; j = i + 4; j < N; j++) // \text{запускаем вложенный цикл}\\ \quad \quad \quad if\; (a[i] + a[j] < min) // \text{ищем минимальную сумму}\\ \quad \quad \quad \quad min = a[i] + a[j];\\ \\ \quad cout << min/2.0;\\ \quad return\; 0;\\ \} \end{array}\]

Задание Б.

Для эффективного решения задания Б создаем буфер, в котором будем хранить первые четыре элемента последовательности, остальные элементы последовательности попадают в очередь. После создания буфера будем вводить следующий элемент из очереди и вычислять его среднее арифметическое с текущим минимальным элементом буфера. Затем проверяем, является ли среднее арифметическое с текущим элементом (тот, который мы вводим с клавиатуры) минимальным, при необходимости запоминаем его, затем записываем текущий элемент в буфер, таким образом циклически заполняя буфер.

Приведем пример программы на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N;\\ \quad int\; const\; b = 4;\\ \quad int\; buf[b];\\ \\ \quad float\; x,\; min = 1001,\; min\_s = 2001;\\ \\ \quad for\; (int\; i = 0; i < b; i++)\{\\ \quad \quad cin >> x;\\ \quad \quad buf[i \% b] = x;\\ \quad \}\\ \\ \quad for\; (int\; i = b; i < N; i++)\\ \quad \{\\ \quad \quad cin >> x;\\ \quad \quad if\; (buf[i \% b] < min)\\ \quad \quad \quad min = buf[i \% b];\\ \quad \quad if\; (x + min < min\_s)\\ \quad \quad \quad min\_s = x + min;\\ \quad \quad buf[i \% b] = x;\\ \quad \}\\ \\ \quad cout << min\_s/2.0;\\ \quad return\; 0;\\ \} \end{array}\]

Ответ: _См. решение_

Задание 9 #12285

Крабоеду поручили срочно написать программу, которая в заданной последовательности неотрицательных чисел находит максимальную сумму квадратов двух ее элементов, номера которых различаются не менее, чем на 7. Известно, что значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000. Напишите такую программу и спасите Крабоеда от приближающегося дедлайна.

Вам предлагаются два задания, связанные с этой задачей: задание А и задание Б. Вы можете решать оба задания А и Б или одно из них по своему выбору. Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание составляет 0 баллов. Задание Б является усложненным вариантом задания А, оно содержит дополнительные требования к программе.

А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования. Обязательно укажите, что программа является решением задания А. Максимальная оценка за выполнение задания А — 2 балла.

Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности \(N\), т.е. при увеличении \(N\) в \(k\) раз время работы программы должно увеличиваться не более чем в \(k\) раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа \(N\) и не превышает 1 килобайта. Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.

Максимальная оценка за правильную программу, эффективную по времени и по памяти — 4 балла. Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.

Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Входные данные представлены следующим образом. В первой строке задаётся число \(N\) — общее количество элементов последовательности. Гарантируется, что \(N > 7\). В каждой из следующих \(N\) строк задаётся одно неотрицательное целое число — очередной элемент последовательности.

Задание А.

Приведем одно из возможных решений задания А на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N; \\ \quad int\; a[10000]; \\ \quad float\; max = -1; \\ \\ \quad for\; (int\; i = 0; i < N; i++) \\ \quad \quad cin >> a[i];\\ \\ \quad for\; (int\; i = 0; i < N; i++) \\ \quad \quad for\; (int\; j = i + 7; j < N; j++) \\ \quad \quad \quad if\; (a[i]*a[i] + a[j]*a[j] > max)\\ \quad \quad \quad \quad min = a[i]*a[i] + a[j]*a[j];\\ \\ \quad cout << max;\\ \quad return\; 0;\\ \} \end{array}\]

Задание Б.

Для эффективного решения задания Б создаем буфер, в котором будем хранить первые семь элементов последовательности, остальные элементы последовательности попадают в очередь. После создания буфера будем вводить следующий элемент из очереди и вычислять его сумму квадратов с текущим максимальным элементом буфера. Затем проверяем, является ли эта сумма максимальной, при необходимости запоминаем ее, затем записываем текущий элемент в буфер, таким образом циклически заполняя буфер.

Приведем пример программы на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N;\\ \quad int\; const\; b = 7;\\ \quad int\; buf[b];\\ \\ \quad int\; x,\; max = -1,\; max\_p = -1;\\ \\ \quad for\; (int\; i = 0; i < b; i++)\{\\ \quad \quad cin >> x;\\ \quad \quad buf[i \% b] = x;\\ \quad \}\\ \\ \quad for\; (int\; i = b; i < N; i++)\\ \quad \{\\ \quad \quad cin >> x;\\ \quad \quad if\; (buf[i \% b] > max)\\ \quad \quad \quad max = buf[i \% b];\\ \quad \quad if\; (x * x + max * max > max\_p)\\ \quad \quad \quad max\_p = x * x + max * max;\\ \quad \quad buf[i \% b] = x;\\ \quad \}\\ \\ \quad cout << max\_p;\\ \quad return\; 0;\\ \} \end{array}\]

Ответ: _См. решение_

Задание 10 #12286

Крабоеду поручили срочно написать программу, которая в заданной последовательности неотрицательных чисел находит максимальную сумму квадратов двух ее элементов, номера которых различаются не менее, чем на 3. Известно, что значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000. Напишите такую программу и спасите Крабоеда от приближающегося дедлайна.

Вам предлагаются два задания, связанные с этой задачей: задание А и задание Б. Вы можете решать оба задания А и Б или одно из них по своему выбору. Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание составляет 0 баллов. Задание Б является усложненным вариантом задания А, оно содержит дополнительные требования к программе.

А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования. Обязательно укажите, что программа является решением задания А. Максимальная оценка за выполнение задания А — 2 балла.

Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности \(N\), т.е. при увеличении \(N\) в \(k\) раз время работы программы должно увеличиваться не более чем в \(k\) раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа \(N\) и не превышает 1 килобайта. Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.

Максимальная оценка за правильную программу, эффективную по времени и по памяти — 4 балла. Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.

Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Входные данные представлены следующим образом. В первой строке задаётся число \(N\) — общее количество элементов последовательности. Гарантируется, что \(N > 3\). В каждой из следующих \(N\) строк задаётся одно неотрицательное целое число — очередной элемент последовательности.

Задание А.

Приведем одно из возможных решений задания А на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N; \\ \quad int\; a[10000]; \\ \quad float\; max = -1; \\ \\ \quad for\; (int\; i = 0; i < N; i++) \\ \quad \quad cin >> a[i];\\ \\ \quad for\; (int\; i = 0; i < N; i++) \\ \quad \quad for\; (int\; j = i + 3; j < N; j++) \\ \quad \quad \quad if\; (a[i]*a[i] + a[j]*a[j] > max)\\ \quad \quad \quad \quad min = a[i]*a[i] + a[j]*a[j];\\ \\ \quad cout << max;\\ \quad return\; 0;\\ \} \end{array}\]

Задание Б.

Для эффективного решения задания Б создаем буфер, в котором будем хранить первые три элемента последовательности, остальные элементы последовательности попадают в очередь. После создания буфера будем вводить следующий элемент из очереди и вычислять его сумму квадратов с текущим максимальным элементом буфера. Затем проверяем, является ли эта сумма максимальной, при необходимости запоминаем ее, затем записываем текущий элемент в буфер, таким образом циклически заполняя буфер.

Приведем пример программы на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N;\\ \quad int\; const\; b = 3;\\ \quad int\; buf[b];\\ \\ \quad int\; x,\; max = -1,\; max\_p = -1;\\ \\ \quad for\; (int\; i = 0; i < b; i++)\{\\ \quad \quad cin >> x;\\ \quad \quad buf[i \% b] = x;\\ \quad \}\\ \\ \quad for\; (int\; i = b; i < N; i++)\\ \quad \{\\ \quad \quad cin >> x;\\ \quad \quad if\; (buf[i \% b] > max)\\ \quad \quad \quad max = buf[i \% b];\\ \quad \quad if\; (x * x + max * max > max\_p)\\ \quad \quad \quad max\_p = x * x + max * max;\\ \quad \quad buf[i \% b] = x;\\ \quad \}\\ \\ \quad cout << max\_p;\\ \quad return\; 0;\\ \} \end{array}\]

Ответ: _См. решение_

Задание 11 #12383

Крабоеду поручили срочно написать программу, которая в заданной последовательности неотрицательных чисел находит количество пар, произведение которых кратно 5, а номера различаются не менее, чем на 5. Известно, что значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000. Напишите такую программу и спасите Крабоеда от приближающегося дедлайна.

Вам предлагаются два задания, связанные с этой задачей: задание А и задание Б. Вы можете решать оба задания А и Б или одно из них по своему выбору. Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание составляет 0 баллов. Задание Б является усложненным вариантом задания А, оно содержит дополнительные требования к программе.

А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования. Обязательно укажите, что программа является решением задания А. Максимальная оценка за выполнение задания А — 2 балла.

Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности \(N\), т.е. при увеличении \(N\) в \(k\) раз время работы программы должно увеличиваться не более чем в \(k\) раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа \(N\) и не превышает 1 килобайта. Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.

Максимальная оценка за правильную программу, эффективную по времени и по памяти — 4 балла. Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.

Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Входные данные представлены следующим образом. В первой строке задаётся число \(N\) — общее количество элементов последовательности. Гарантируется, что \(N > 5\). В каждой из следующих \(N\) строк задаётся одно неотрицательное целое число — очередной элемент последовательности.

Задание А.

Приведем одно из возможных решений задания А на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N; \\ \quad int\; a[10000]; \\ \quad int\; count = 0; \\ \\ \quad for\; (int\; i = 0; i < N; i++) \\ \quad \quad cin >> a[i];\\ \\ \quad for\; (int\; i = 0; i < N; i++)\\ \quad \quad for\; (int\; j = i + 5; j < N; j++)\\ \quad \quad \quad if\; (a[i]*a[j]\%5==0) \\ \quad \quad \quad \quad count++;\\ \\ \quad cout << count;\\ \quad return\; 0;\\ \} \end{array}\]

Задание Б.

Для эффективного решения задания Б создаем буфер, в котором будем хранить первые пять элементов последовательности, а также создадим счетчики: общий и для элементов, кратных 5. Введем с клавиатуры первые 5 элементов в буфер. Затем каждый новый элемент последовательности будем проверять на кратность 5: если новый элемент кратен 5, то к общему счетчику нужно прибавить количество элементов до него, не считая пяти последних (включая считанное); если новый элемент не кратен 5, то к общему счетчику прибаляем счетчик чисел, кратных 5.

Приведем пример программы на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N;\\ \quad int\; const\; b = 5;\\ \quad int\; buf[b];\\ \\ \quad int\; x,\; count = 0, \; count\_5=0;\\ \\ \quad for\; (int\; i = 0; i < b; i++)\{\\ \quad \quad cin >> buf[i];\\ \quad \}\\ \\ \quad for\; (int\; i = b;\;i < N;\; i++)\\ \quad \{\\ \quad \quad cin >> x;\\ \quad \quad if\; (buf[0] \% 5 == 0)\\ \quad \quad \quad count\_5++;\\ \quad \quad if\; (x \% 5==0)\\ \quad \quad \quad count = count+i-b+1;\\ \quad \quad else\\ \quad \quad \quad count=count+count\_5;\\ \quad \quad for\;(int\;j=0;\;j<b-1;\;j++)\\ \quad \quad \quad buf[j]=buf[j+1];\\ \quad \quad buf[b-1]=x;\\ \quad \}\\ \\ \quad cout << count;\\ \quad return\; 0;\\ \} \end{array}\]

Ответ: _См. решение_

Задание 12 #12384

Крабоеду поручили срочно написать программу, которая в заданной последовательности неотрицательных чисел находит количество пар, произведение которых кратно 3, а номера различаются не менее, чем на 7. Известно, что значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000. Напишите такую программу и спасите Крабоеда от приближающегося дедлайна.

Вам предлагаются два задания, связанные с этой задачей: задание А и задание Б. Вы можете решать оба задания А и Б или одно из них по своему выбору. Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание составляет 0 баллов. Задание Б является усложненным вариантом задания А, оно содержит дополнительные требования к программе.

А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования. Обязательно укажите, что программа является решением задания А. Максимальная оценка за выполнение задания А — 2 балла.

Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности \(N\), т.е. при увеличении \(N\) в \(k\) раз время работы программы должно увеличиваться не более чем в \(k\) раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа \(N\) и не превышает 1 килобайта. Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.

Максимальная оценка за правильную программу, эффективную по времени и по памяти — 4 балла. Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.

Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Входные данные представлены следующим образом. В первой строке задаётся число \(N\) — общее количество элементов последовательности. Гарантируется, что \(N > 5\). В каждой из следующих \(N\) строк задаётся одно неотрицательное целое число — очередной элемент последовательности.

Задание А.

Приведем одно из возможных решений задания А на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N; \\ \quad int\; a[10000]; \\ \quad int\; count = 0; \\ \\ \quad for\; (int\; i = 0; i < N; i++) \\ \quad \quad cin >> a[i];\\ \\ \quad for\; (int\; i = 0; i < N; i++)\\ \quad \quad for\; (int\; j = i + 7; j < N; j++)\\ \quad \quad \quad if\; (a[i]*a[j]\%3==0) \\ \quad \quad \quad \quad count++;\\ \\ \quad cout << count;\\ \quad return\; 0;\\ \} \end{array}\]

Задание Б.

Для эффективного решения задания Б создаем буфер, в котором будем хранить первые семь элементов последовательности, а также создадим счетчики: общий и для элементов, кратных 3. Введем с клавиатуры первые 7 элементов в буфер. Затем каждый новый элемент последовательности будем проверять на кратность 3: если новый элемент кратен 3, то к общему счетчику нужно прибавить количество элементов до него, не считая семи последних (включая считанное); если новый элемент не кратен 3, то к общему счетчику прибаляем счетчик чисел, кратных 3.

Приведем пример программы на языке С++:

\[\begin{array}{l} \#include <iostream>\\ using\; namespace\; std;\\ int\; main()\\ \{ \\ \quad int\; N;\\ \quad cin >> N;\\ \quad int\; const\; b = 7;\\ \quad int\; buf[b];\\ \\ \quad int\; x,\; count = 0, \; count\_3=0;\\ \\ \quad for\; (int\; i = 0; i < b; i++)\{\\ \quad \quad cin >> buf[i];\\ \quad \}\\ \\ \quad for\; (int\; i = b;\;i < N;\; i++)\\ \quad \{\\ \quad \quad cin >> x;\\ \quad \quad if\; (buf[0] \% 3 == 0)\\ \quad \quad \quad count\_3++;\\ \quad \quad if\; (x \% 3==0)\\ \quad \quad \quad count = count+i-b+1;\\ \quad \quad else\\ \quad \quad \quad count=count+count\_3;\\ \quad \quad for\;(int\;j=0;\;j<b-1;\;j++)\\ \quad \quad \quad buf[j]=buf[j+1];\\ \quad \quad buf[b-1]=x;\\ \quad \}\\ \\ \quad cout << count;\\ \quad return\; 0;\\ \} \end{array}\]

Ответ: _См. решение_