πЕГЭ · ИИ-репетитор12 предметов · задания ФИПИ
Главная → Информатика → Задания №17 → Задание i17-03

Задание №17 ЕГЭ Информатика с ответом и решением

Ответ: 1569269 19982

Условие

В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000. Определите и запишите в ответе сначала количество пар элементов последовательности, разность которых четна и хотя бы одно из чисел делится на 31, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два различных элемента последовательности. Порядок элементов в паре не важен.

Подсказки — как подойти к решению

  1. Прочитай все числа из файла в список: они записаны по одному в строке, всего 10 000 значений.
  2. Пара — два различных элемента последовательности, порядок не важен, поэтому перебор должен идти без повторений (i < j).
  3. Условий два: разность элементов должна быть чётной (то есть числа одинаковой чётности) и хотя бы одно из чисел должно делиться на 31; счётчик и максимум суммы обновляй только при выполнении обоих.

Решение

Сначала считаем все числа из файла в массив. Для каждой пары будем проверять, делится ли хотя бы одно число из пары на 31, а также то, чётна ли разность элементов пары. При успешном выполнении условий будем увеличивать значения счётчика count и проверять, больше ли сумма элементов пары текущей максимальной суммы. Если сумма элементов пары больше текущей максимальной суммы, будем обновлять значение переменной maxsum.

Приведём решение задачи на языке Pascal.

var

i, j: integer;

count: longint;

maxsum: integer;

arr: array[1..10000] of integer;

f: text;

begin

assign(f,'C:\17.txt');

reset(f);

maxsum := 0;

count := 0;

for i := 1 to 10000 do readln(f, arr[i]);

for i := 1 to 10000 - 1 do

for j := i + 1 to 10000 do begin

if (arr[i] mod 31 = 0) or (arr[j] mod 31 = 0) then

if ((arr[i] - arr[j]) mod 2 = 0) then begin

count := count + 1;

if arr[i] + arr[j] > maxsum then maxsum := arr[i] + arr[j];

end;

end;

writeln(count, ' ', maxsum);

end.

Приведём решение Николая Чуркина (Тимашевск) на языке Python.

count = m = 0

f = open('17.txt')

l = [int(i) for i in f]

for i in range(len(l) - 1):

for j in range(i + 1, len(l)):

if (l[i] - l[j]) % 2 == 0 and (l[i] % 31 == 0 or l[j] % 31 == 0):

count += 1

m = max(m, l[i] + l[j])

print(count, m)

В результате работы данного алгоритма при вводе данных из файла ответ — 1569269 19982.

Примечание.

Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.

Приведём решение Ивана Шапошникова на языке Python.

file = open('17.txt').readlines()

s = [int(n) for n in file]

s31 = [n for n in s if n % 31 == 0]

s0 = [n for n in s if n % 31 != 0]

count = 0

maxNum = 0

count = m = 0

for i in range(len(s31)):

for y in range(len(s0)):

if abs(s31[i] - s0[y]) % 2 == 0:

count += 1

maxNum = max(maxNum, s31[i] + s0[y])

for i in range(len(s31) - 1):

for y in range(i + 1, len(s31)):

if abs(s31[i] - s31[y]) % 2 == 0:

count += 1

maxNum = max(maxNum, s31[i] + s0[y])

print(count, maxNum)

Приведём решение Ильи Андрианова на языке Python.

M = [int(x) for x in open('17.txt')]

R = []

for i in range(0, len(M)):

for j in range(i+1, len(M)):

x, y = M[i], M[j]

if (x - y) % 2 == 0:

if x % 31 == 0 or y % 31 == 0:

R.append(x + y)

print(len(R), max(R))

Приведём решение Сергея Донец на PascalABC.NET:

begin

var p:=ReadAllLines('17.txt').Select(x->x.ToInteger);

var m:=p.Combinations(2)

.Where(\(a,b)->((a-b).divs(2))and(a.divs(31)or b.divs(31)))

.ToArray;

m.Length.print;

m.Max(\(a,b)->a+b).Print;

end.

Типичные ошибки

Решить это задание в тренажёре

В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №17 по информатике