Задание 27 ЕГЭ по информатике — Анализ данных: кластеризация и центры
Разбор номера «Анализ данных: кластеризация и центры»: как устроено задание, настоящие формулировки из тренажёра с подсказками и официальным решением. Окно практики открывается сразу — без регистрации и онбординга.
Задание 27 (№27 — Анализ данных: кластеризация и центры) — вопрос первой части экзамена по информатике: короткий ответ, который проверяется автоматически. Ниже — реальные формулировки из тренажёра с подсказками и разбором; проверка работает прямо на этой странице.
Окно примера ниже — то же, что на сайте: подсказки по одной, автопроверка ответа и разбор.
Примеры задания 27
№ 27Пример 1краткий ответ★★★★★1 первичный балл
Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 5 и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число — максимально возможную сумму, соответствующую условиям задачи. Входные данные. Файл A Файл B Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество пар N (1 ≤ N ≤ 100 000). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000. Пример организации исходных данных во входном файле: 6 1 3 5 12 6 9 5 4 3 3 1 1 Для указанных входных данных значением искомой суммы должно быть число 33. В ответе укажите два числа: сначала значение искомой суммы для файла А, затем для файла B. Предупреждение: для обработки файла B не следует использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго. Ответ:
Подсказка 1. Выдели точное требование: сколько чисел выбираем, по каким правилам (кратность, расстояние, порядок) и что ищем — сумму или количество.
Подсказка 2. Подбери метод под условие: остатки по модулю делителя, перебор с оптимизацией, скользящее окно с максимумом на префиксе или жадный набор максимумов.
Подсказка 3. Проверяй решение на полном наборе данных, а не на примере из условия. Ловушка — путать индексы с значениями и упустить условие на расстояние.
Разбор.
Решение. Последовательно считывая данные из файла, будем прибавлять к сумме максимальное число в паре. Также заметим, что в случае, если получившееся в результате суммирование максимальных чисел во всех парах число будет кратно пяти, достаточно будет вычесть из этой суммы минимальную разницу между какими-либо двумя числами. Для этого при считывании пар помимо максимального числа в каждой паре будем искать минимальную разницу среди пар, не кратную пяти. Приведём решение задачи на языке Pascal. var x, y: integer; n: integer; sum: integer; mindif: integer; f: text; begin assign(f,'C:\27-A.txt'); reset(f); readln(f, n); sum := 0; mindif := 20001; while not eof(f) do begin readln(f, x, y); if x > y then sum := sum + x else sum := sum + y; if (abs(x - y) 0) then mindif := abs(x-y); end; if sum mod 5 <> 0 then writeln(sum) else writeln(sum - mindif); end. В результате работы данного алгоритма при вводе данных из файла A ответ — 118951, из файла B — 394491666. Приведём решение Романа Князева на языке Python. f = open('27-B_1.txt') n = int(f.readline()) s, minn = 0, 20001 for i in range(n): x, y = map(int, f.readline().split()) s += max(x, y) d = abs(x - y) if d % 5 != 0 : minn = min(d, minn) if s % 5 != 0: print(s) else: print(s - minn) Примечание. Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере. Приведём решение Артёма Гридина на языке Python. f = open('27-B_1.txt') numbers = [] n = f.readline() for m in f.readlines(): numbers.append(tuple(map(int, m.split()))) s = 0 for t in numbers: if s+t[0]%5 != 0 and s+t[1]%5 != 0: s+=max(t) elif s+t[0]%5 != 0: s+=t[0] else: s+=t[1] print(s) -->
Ответ.
118951 394491666
№ 27Пример 2краткий ответ★★★★★1 первичный балл
Дана последовательность целых чисел. Необходимо найти максимально возможную сумму её непрерывной подпоследовательности, в которой количество положительных чётных элементов кратно k = 30. Входные данные. Файл A Файл B Первая строка входного файла содержит целое число N — общее количество чисел в наборе. Каждая из следующих N строк содержит одно число. Гарантируется, что общая сумма любой выборки заданных чисел не превышает 2 · 109 по абсолютной величине. Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. В ответе укажите два числа: сначала значение искомой суммы для файла A, затем для файла B. Ответ:
Подсказка 1. Выдели точное требование: сколько чисел выбираем, по каким правилам (кратность, расстояние, порядок) и что ищем — сумму или количество.
Подсказка 2. Подбери метод под условие: остатки по модулю делителя, перебор с оптимизацией, скользящее окно с максимумом на префиксе или жадный набор максимумов.
Подсказка 3. Проверяй решение на полном наборе данных, а не на примере из условия. Ловушка — путать индексы с значениями и упустить условие на расстояние.
Разбор.
Решение. Приведём решение на языке Python. f = open("27-B.txt") n = int(f.readline()) lefts = [0 for i in range(30)] maxsum = 0 for i in range(30): lefts[i] = 2 * 1000000000 count = 0 sum = 0 for i in range(1, n + 1): num = int(f.readline()) sum = sum + num if (num % 2 == 0) and (num > 0): count = count + 1 d = count % 30 if sum Ответ: 97011 24932. Примечание. Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере. Приведём другое решение. Для нахождения искомой суммы найдём сумму всех чисел в файле и, если количество чётных положительных чисел этой суммы не будет кратно 30, вычтем из этой суммы число, являющееся минимальной подсуммой чисел с таким же количеством чётных положительных чисел, кратных 30, как и у суммы всех чисел в файле. Будем последовательно считывать числа из файла. В массив lefts будем записывать первые встречающиеся суммы с количеством чётных элементов, делящимся на 30 с остатком от нуля до двадцати девяти. Каждое считанное число будем прибавлять к переменной sum. Если очередное встреченное число является чётным и положительным, будем увеличивать значение счётчика count. Каждую итерацию цикла будем проверять, больше ли текущая максимальная сумма в переменной maxsum больше значения выражения sum − lefts[d] (в этом выражении получаем значение новой подсуммы, с количеством чётных положительных чисел кратным 30). Если значение переменной maxsum меньше — обновляем её значение. Приведём решение задачи на языке Pascal. var i, n, num, count, d: integer; sum, maxsum: int64; lefts: array[0..29] of int64; f: text; begin assign(f,'C:\27-B.txt'); reset(f); readln(f, n); for i := 0 to 29 do begin lefts[i] := 2 * 1000000000; end; count := 0; sum := 0; for i := 1 to n do begin readln(f, num); sum := sum + num; if (num mod 2 = 0) and (num > 0) then count := count + 1; d := count mod 30; if sum В результате работы данного алгоритма при вводе данных из файла A ответ — 97011, из файла B — 24932.
Ответ.
97011 24932
Как устроена практика в тренажёре
Опыт за каждое решение
Чистое решение без подсказок ценится выше: опыт, уровни и серии растут с каждым заданием, а не за клики.
Ошибки не пропадают
Нерешённое возвращается в работу над ошибками — тренажёр приведёт к заданию снова, пока оно не закроется без помощи.
Прогноз балла
После нескольких решённых номеров тренажёр показывает прогнозный балл и говорит, какие темы подтянуть, чтобы его поднять.
Закрепи задание 27 в тренажёре
Окно практики откроется сразу — без имени и онбординга. Прогресс сохранится, как только укажешь имя.