Как решать 27 задание егэ по информатике на python

На уроке рассмотрен разбор 27 задания ЕГЭ по информатике: дается подробное объяснение и решение задания 2017 года

Содержание:

  • Объяснение задания 27 ЕГЭ по информатике
  • Решение 27 заданий ЕГЭ по информатике
  • Задания 2021 и более поздние
  • Задания предыдущих лет на повторение
    • На вход программы поступает последовательность чисел, произвести анализ пар
    • Выбрать из каждой пары одно число
    • Набор данных, состоящих из троек чисел
    • Анализ пар, находящихся на расстоянии

27-е задание: «Анализ числовых последовательностей»

Уровень сложности

— высокий,

Требуется использование специализированного программного обеспечения

— да,

Максимальный балл

— 2,

Примерное время выполнения

— 35 минут.

  
Проверяемые элементы содержания: Умение создавать собственные программы (20–40 строк) для анализа числовых последовательностей

Рекомендации по выполнению:

«О выборе языка программирования. Выбирайте тот язык, которым лучше всего владеете. Никакого повышения или снижения баллов за экзотичность языка не предусмотрено.»

Типичные ошибки и рекомендации по их предотвращению:

ФГБНУ «Федеральный институт педагогических измерений»

Работа с записями

Запись в Паскале — это сложный тип данных, который может состоять из нескольких элементов – полей; поля могут иметь различный тип.

Подробно о записях объясняется здесь.

Решение 27 заданий ЕГЭ по информатике

Плейлист видеоразборов задания на YouTube:
Задание демонстрационного варианта 2022 года ФИПИ

Задания 2021 и более поздние

27_1 new:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

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

Входные данные:
Даны два входных файла: файл A (27-1a.txt) и файл B (27-1b.txt), каждый из которых содержит в первой строке количество пар N (1 ≤ N ≤ 100000). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.

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

6
1 3
5 12
6 9
5 4
3 3
1 1

Пример выходных данных для приведённого выше примера входных данных:

20

✍ Решение:

    Язык PascalABC.NET:

Язык Python (Питон):

f = open ('27-1b.txt') # для первого ответа - 27-1a.txt
n=int(f.readline())
data=f.readlines()
summa=0
minim=10001 # для минимальной разницы
for i in range(0, n):
    s = data[i].split()
    a=int(s[0])
    b=int(s[1])
    summa+=min(a,b) # сумма максимумов из пар
    raznitsa = abs(a-b) # разница
    if raznitsa % 3 != 0:
        minim=min(minim,raznitsa)
if summa % 3 != 0:
    print(summa)
else:
    print(summa + minim) # здесь добавляем! т.к. иначе берем наибольший из пары

Ответ: 67303 200157496

Задания предыдущих лет на повторение

На вход программы поступает последовательность чисел, произвести анализ пар

27_4:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  
Компьютер наземной станции слежения получает от объектов-самолётов, находящихся в зоне её работы, идентификационные сигналы, представляющие собой последовательность из N целых положительных чисел. Каждый объект направляет на наземную станцию уникальное число, т. е. все числа в получаемой станцией последовательности различны. Обработка сигнала представляет собой рассмотрение всех пар различных элементов последовательности, при этом элементы пары не обязаны быть переданы непосредственно друг за другом, порядок элементов в паре не важен. Считается, что возникла одна критическая ситуация, если произведение элементов некоторой пары кратно 58.

Необходимо определить общее количество возникших критических ситуаций.

Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (1 < N < 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: общее количество возникших критических ситуаций.

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

4
2
6
29
87

Пример выходных данных для приведённого выше примера входных данных:

4

Из четырёх заданных чисел можно составить б попарных произведений:

2*6 = 12 
2*29 = 58 
2*87 = 174 
6*29 = 174 
6*87 = 522 
29*87 = 2523

Из них на 58 делятся 4 произведения (выделены синим).

Требуется написать эффективную по времени и по памяти программу для решения описанной задачи.

✍ Решение:
 

✎ Программа эффективна по времени и по памяти (4 балла):

  • Язык Паскаль (версия PascalABC):
  • var
      N: integer; {количество чисел} 
      a: integer; {очередное число} 
      n58, n29, n2: integer;
      k58: integer; {количество требуемых пар} 
      i: integer;
     
    begin
      readln(N);
      n58 := 0; 
      n29 := 0; 
      n2 := 0; 
      for i := 1 to N do 
      begin
        readln(a);
        if a mod 58 = 0 then 
          n58 := n58 + 1 
        else if a mod 29 = 0 then 
          n29 := n29 + 1 
        else if a mod 2 = 0 then 
          n2 := n2 + 1;
      end;
      k58 := n58 * (n58 - 1) div 2 + n58 * (N - n58) + n2 * n29; 
      writeln(k58)
    end.
  • Язык Python (версия Python 3):
  • n=int(input())
    n58,n29,n2=0,0,0
    for i in range(n):
        a=int(input())
        if a % 28 == 0:
            n58+=1
        elif a % 29 == 0:
            n29+=1
        elif a % 2 == 0:
            n2+=1
    k58=n58 * (n58-1) // 2 + n58 * (n-n58) + n2 * n29
    print(k58)
  • Язык Бейсик:
  • N58 = 0
    N2 = 0
    N29 = 0
    NX = 0
    INPUT N
    FOR I = 1 TO N
       INPUT A
     IF A MOD 58 = 0 THEN
       N58 = N58 + 1
     ELSE
       IF A MOD 29 = 0 THEN
         N29 = N29 + 1
        ELSE
          IF A MOD 2 = 0 THEN
            N2 = N2 + 1
          ELSE NX = NX + 1
          END IF
        END IF
     END IF
    NEXT I
    K58 = N58*(N58 - 1)2 + N58*(N2 + N29 + NX) + N2*N29
    PRINT K58
  • Произведение двух чисел делится на 58, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
  • A. Оба сомножителя делятся на 58.
  • Б. Один из сомножителей делится на 58, а другой не делится.
  • B. Ни один из сомножителей не делится на 58, но один сомножитель делится на 2, а другой — на 29.
  • Почему именно 2 и 29?
  • Берем два делителя числа 58, произведение которых дает число 58: 2*29 = 58. При этом одно из них — наименьший делитель (в нашем случае 2), а другой, не должен делиться на первый найденный делитель (29/2 <> 0).
  • Условие делимости произведения на 58 можно сформулировать проще, например так:
  • (один из сомножителей делится на 58) 
                        ИЛИ 
    (один сомножитель делится на 2, а другой — на 29)
    
  • Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.
  • При вводе чисел можно определять, делится ли каждое из них на 58, 2 и 29, и подсчитывать следующие значения:
    1. n58 — количество чисел, кратных 58;
    2. n29 —количество чисел, кратных 29, но не кратных 2 и 58;
    3. n2 — количество чисел, кратных 2, но не кратных 29 и 58.
  • Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков.
  • Количество пар, удовлетворяющих условию А, можно вычислить по формуле n58*(n58 - 1)/2.
  • Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n58*(N - n58).
  • Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2 * n29.
  • Поэтому искомое количество пар вычисляется по формуле:
  • n58 * (n58 - 1)/2 + n58 * (N - n58) + n2 * n29

✎ Программа неэффективная (2 балла):

  • Язык Паскаль (версия PascalABC):
  • var
      i, j, k, n: integer;
      a: array[1..1000]of integer;//очередное значение
     
    begin
      readln(n);
      for i := 1 to n do 
      begin
        readln(a[i]); 
      end;
      k := 0;
      for i := 1 to n - 1 do 
        for j := i + 1 to n do
          if a[i] * a[j] mod 58 = 0 then 
            k := k + 1;
      writeln(k);
    end.

    Полный перебор: все числа сохраняются в массиве, рассматриваются все возможные пары и подсчитывается количество подходящих произведений.


27_6: Разбор 27 задания демоверсии 2018 года:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов делится на 26.

Описание входных и выходных данных В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 26.

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

4
2
6
13
39

Пример выходных данных для приведённого выше примера входных данных:

4

Из четырёх заданных чисел можно составить 6 попарных произведений:

2·6 = 12 
2·13 = 26 
2·39 = 78 
6·13 = 78
6·39 = 234 
13·39 = 507

Из них на 26 делятся 4 произведения:

2·13=26; 
2·39=78; 
6·13=78; 
6·39=234

Требуется написать эффективную по времени и по памяти программу для
решения описанной задачи.

✍ Решение:
 

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

    Произведение двух чисел делится на 26, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
    А. Оба сомножителя делятся на 26.
    Б. Один из сомножителей делится на 26, а другой не делится.
    В. Ни один из сомножителей не делится на 26, но один сомножитель делится на 2, а другой – на 13.

    Примечание для проверяющего. Условие делимости произведения на 26 можно сформулировать проще, например, так:
    (один из сомножителей делится на 26) ИЛИ
    (один сомножитель делится на 2, а другой – на 13).
    Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.

    При вводе чисел можно определять, делится ли каждое из них на 26, 2 и 13, и подсчитывать следующие значения:
    1) n26 – количество чисел, кратных 26;
    2) n13 – количество чисел, кратных 13, но не кратных 26;
    3) n2 – количество чисел, кратных 2, но не кратных 26.

    Примечание для проверяющего. Сами числа при этом можно не хранить.
    Каждое число учитывается не более чем в одном из счётчиков.
    Количество пар, удовлетворяющих условию А, можно вычислить по формуле n26·(n26 – 1)/2.
    Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n26·(N – n26).
    Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2·n13.
    Поэтому искомое количество пар вычисляется по формуле

    n26·(n26 – 1)/2 + n26·(N – n26) + n2·n13

    ✎ Программа эффективна и по времени, и по памяти (4 балла):
    Программа на языке Паскаль (версия PascalABC):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    var
      N: integer; {количество чисел}
      a: integer; {очередное число}
      n26, n13, n2: integer;
      k26: integer; {количество требуемых пар}
      i: integer;
    begin
      readln(N);
      n26 := 0;n13 := 0;n2 := 0;
      for i := 1 to N do 
      begin
        readln(a);
        if a mod 26 = 0 then
          n26 := n26 + 1
        else if a mod 13 = 0 then
          n13 := n13 + 1
        else if a mod 2 = 0 then
          n2 := n2 + 1;
      end;
      k26 := n26 * (n26 - 1) div 2 + n26 * (N - n26) + n2 * n13;
      writeln(k26)
    end.

    Программа на языке Python (версия Python 3):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    n=int(input())
    n26,n13,n2=0,0,0
    for i in range(n):
        a=int(input())
        if a % 26 == 0:
            n56+=1
        elif a % 13 == 0:
            n13+=1
        elif a % 2 == 0:
            n2+=1
    k26=n26 * (n26-1) // 2 + n26 * (n-n26) + n2 * n13
    print(k26)

    Программа на языке Бейсик:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    N26 = 0
    N2 = 0
    N13 = 0
    NX = 0
    INPUT N
    FOR I = 1 TO N
       INPUT A
     IF A MOD 26 = 0 THEN
       N26 = N26 + 1
     ELSE
       IF A MOD 13 = 0 THEN
         N13 = N13 + 1
        ELSE
          IF A MOD 2 = 0 THEN
            N2 = N2 + 1
          ELSE NX = NX + 1
          END IF
        END IF
     END IF
    NEXT I
    K26 = N26*(N26 - 1)2 + N26*(N2 + N13 + NX) + N2*N13
    PRINT K26

27_7: Разбор досрочного экзамена 2020 г, ФИПИ (2 вариант):

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  

Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, разность которых чётна, и в этих парах, по крайней мере, одно из чисел пары делится на 19. Порядок элементов в паре неважен. Среди всех таких пар нужно найти и вывести пару с максимальной суммой элементов. Если одинаковую максимальную сумму имеет несколько пар, можно вывести

любую из них

. Если подходящих пар в последовательности нет,

нужно вывести два нуля

.

  
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (2 ≤ N ≤ 10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Пример входных данных:

5
38
12
57
16
57

Пример выходных данных для приведённого выше примера входных данных:

57 57

Пояснение. Из данных пяти чисел можно составить три различные пары, удовлетворяющие условию: (38, 12), (38, 16), (57, 57). Наибольшая сумма получается в паре (57, 57). Эта пара допустима, так как число 57 встречается в исходной последовательности дважды.

Напишите эффективную по времени и памяти программу для решения этой задачи.

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

Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и памяти, – 4 балла.
Максимальная оценка за правильную программу, эффективную только по времени или только по памяти, – 3 балла.
Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, – 2 балла.

Вы можете сдать одну или две программы решения задачи. Если Вы сдадите две программы, каждая из них будет оцениваться независимо от другой, итоговой станет бо́льшая из двух оценок.
Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.

Типовые задания для тренировки

✍ Решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  • ✎ Программа эффективна по времени и памяти
  • Язык Pascal (PascalABC):
    Вариант 1:

    const
      p = 19;
     
    var
      N: integer; {количество чисел}
      a: integer; {очередное число}
      m0, m1: integer; {чётный и нечётный максимумы}
      mp0, mp1: integer;  {чётный и нечётный максимумы, кратные p}
      x, y: integer; {ответ – пара чисел}
      i: integer;
     
    begin
      m0 := 0; m1 := 0;
      mp0 := 0; mp1 := 0;
      x := 0; y := 0;
      readln(N);
      for i := 1 to N do
      begin
        readln(a);   
         // для четных
        if a mod 2 = 0 then  
        begin
          // если кратное
          if (a mod p = 0) and (a >= mp0) then 
            begin
              if mp0 > m0 then
                m0:= mp0;
              mp0:=a
            end     
            else if a > m0 then 
              m0 := a;
         end
         else 
            begin
        // для нечетных
            if (a mod p = 0)and(a>=mp1) then 
              begin 
                if mp1>m1 then 
                  m1:=mp1;
                mp1 := a;
              end
              else if a>m1 then
                m1:=a;
             end;  
      end;
     //  writeln('mp0=', mp0, 'm0=', m0);
      if (mp0 > 0) and (m0 > 0) then
      begin
        x := mp0; y := m0; 
      end; 
     // writeln('mp1=', mp1, 'm1=', m1);
      if (mp1 > 0) and (m1 > 0) and (mp1 + m1 > x + y) then
      begin
        x := mp1; 
        y := m1;
      end;
      writeln('=', x, ' ', y)
    end.

    Язык Pascal (PascalABC):
    Вариант 2:

    const
      p = 19;
     
    var
      n, i, x, k19n, k19chet, n19chet, n19n, m1, m2: integer;
     
    begin
      readln(n); {количество чисел}
      readln(x); {первое число}
      // обнуление всех переменных
     
      k19chet := 0; // четный кратный
      n19chet := 0; // четный некратный
      k19n := 0; // нечетный кратный
      n19n := 0; // нечетный некратный
      m1 := 0; m2 := 0; // максимальные
      // цикл до n - 1, т.к. первое число уже считали
      for i := 1 to n - 1 do
      begin
        // проверка, если четный и кратный
        if (x mod p = 0) and (x mod 2 = 0) and (x > k19chet) then
        begin
          k19chet := x;
        end;
        // проверка, если четный и некратный
        if (x mod p <> 0) and (x mod 2 = 0) and (x > n19chet) then
        begin
          n19chet := x;
        end;
        // проверка, если нечетный и кратный
        if (x mod p = 0) and (x mod 2 = 1) and (x > k19n) then
        begin
          k19n := x;
        end;
        // проверка, если нечетный и некратный  
        if (x mod p <> 0) and (x mod 2 = 1) and (x > n19n) then 
        begin
          n19n := x;
        end;
     
        readln(x); // считываем очередное число
        // если x кратно и есть такое некратное n19chet, сумма с которым была бы больше чем m1 + m2
        if (x mod p = 0) and ((x + n19chet) mod 2 = 0) and (x + n19chet > m1 + m2) and (n19chet > 0) then
        begin
          m1 := x; m2 := n19chet;
        end;
        // если x кратно и есть такое некратное n19n, сумма с которым была бы больше чем m1 + m2
        if (x mod p = 0) and ((x + n19n) mod 2 = 0) and (x + n19n > m1 + m2) and (n19n > 0) then
        begin
          m1 := x; m2 := n19n;
        end;
        // если есть такое кратное k19n, сумма с которым была бы четной и больше чем m1 + m2
        if ((x + k19n) mod 2 = 0) and (x + k19n > m1 + m2) and (k19n > 0) then
        begin
          m1 := x; m2 := k19n;
        end;
        // если есть такое кратное k19chet, сумма с которым была бы четной и больше чем m1 + m2
        if ((x + k19chet) mod 2 = 0) and (x + k19chet > m1 + m2) and (k19chet > 0) then
        begin
          m1 := x; m2 := k19chet;
        end;
      end;
      writeln(m1, ' ', m2)
    end.
    Язык Python (Python 3)

    :

    p = 19
    m0 = m1 = mp0 = mp1 = 0
    N = int(input())
    for i in range(N):
    	 a = int(input())
    	 if a % 2 == 0:
    		 if a % p == 0 and a >= mp0:
    			 if mp0 > m0: m0 = mp0
    			 mp0 = a
    		 elif a > m0: m0 = a
    	 else:
    		 if a % p == 0 and a >= mp1:
    			 if mp1 > m1: m1 = mp1
    			 mp1 = a
    		 elif a > m1: m1 = a
    x = y = 0
    if mp0 > 0 and m0 > 0:
    	x = mp0; y = m0
    if mp1 > 0 and m1 > 0 and mp1 + m1 > x + y:
    	x = mp1; y = m1
    print(x,y)

    Ещё один путь решения – записать всю последовательность в массив и анализировать её в несколько проходов. Ниже приводится реализующая такой алгоритм программа на языке C++. В этой программе массив с исходными данными обрабатывается два раза: на первом проходе находятся индексы максимального чётного и нечётного элементов, кратных p, на втором проходе – общие чётный и нечётный максимумы. При этом элементы, выделенные как кратные при первом проходе, во время второго прохода из сравнения исключаются. Такая программа эффективна по времени (несмотря на повторную обработку массива, общее время работы пропорционально N), но неэффективна по памяти. Максимальная оценка за такую программу при отсутствии в ней синтаксических и содержательных ошибок – 3 балла.

  • ✎ Правильная программа на языке C++, эффективная только по времени
  • С++:

    #include <iostream>
    using namespace std;
    int main() {
     const int p = 19; // делитель
     int N; cin >> N; // количество элементов
     int a[N]; // элементы последовательности
     for (int i = 0; i < N; ++i) cin >> a[i];
     int imp0 = -1, imp1 = -1; //индексы максимумов, кратных p
     for (int i = 0; i < N; ++i) {
    	if (a[i] % p == 0) {
    		 if (a[i] % 2 == 0) {
    			if (imp0 == -1 || a[i] > a[imp0]) imp0 = i;
    		}
    		else {
    			if (imp1 == -1 || a[i] > a[imp1]) imp1 = i;
    		}
    	}
     }
     int im0 = -1, im1 = -1; // индексы общих максимумов
     for (int i = 0; i < N; ++i) {
    	 if (i != imp0 && i != imp1) {
    		 if (a[i] % 2 == 0) {
    			if (im0 == -1 || a[i] > a[im0]) im0 = i;
    		 }
    		 else {
    			if (im1 == -1 || a[i] > a[im1]) im1 = i;
    		 }
    	 }
     }
     int x = 0, y = 0; // пара чисел для ответа
     if (imp0 != -1 && im0 != -1) {
    	x = a[imp0]; y = a[im0];
     }
     if (imp1 != -1 && im1 != -1 && a[imp1] + a[im1] > x + y) {
    	x = a[imp1]; y = a[im1];
     }
     cout << x << ' ' << y << endl;
     return 0;
    }
  • ✎ Правильная, но неэффективная программа на языке Паскаль
  • Запишем все исходные числа в массив, переберём все возможные пары и выберем подходящую. Такое решение не является эффективным ни по памяти (требуемая память зависит от размера исходных данных), ни по времени (количество возможных пар, а значит, количество действий и время счёта с ростом количества исходных элементов растут квадратично). Подобная программа оценивается не выше 2 баллов.

    Язык Pascal (версия PascalABC):

    const
      p = 19;
    var
      N: integer; {количество чисел}
      a: array [1..10000] of integer; {исходные данные}
      x, y: integer; {ответ – пара чисел}
      i, j: integer;
    begin
      readln(N);
      for i := 1 to N do readln(a[i]);
      x := 0; y := 0;
      for i := 1 to N - 1 do
      begin
        for j := i + 1 to N do
        begin
          if ((a[i] - a[j]) mod 2 = 0) and
                ((a[i] mod p = 0) or (a[j] mod p = 0)) and
          (a[i] + a[j] > x + y)
          then
          begin
            x := a[i]; y := a[j]
          end
        end
      end;
      writeln(x, ' ', y)
    end.

Выбрать из каждой пары одно число

27_1:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

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

Напишите программу для решения этой задачи. В этом варианте задания оценивается только правильность программы, время работы и размер использованной памяти не имеет значения.

Максимальная оценка за правильную программу — 2 балла.

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

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

Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.

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

Как в варианте А, так и в варианте Б программа должна напечатать одно число — максимально возможную сумму, соответствующую условиям задачи (или 0, если такую сумму получить нельзя).

Например:
2  6
4  1
7  3
2  9
7  4
sum=231

✍ Решение:

✎ Задание Б (алгоритм), более сложное, 4 балла:

  • поскольку в задании указано, что «имеется набор данных, состоящих из пар…», то введем в программу переменную n для количества пар, значение которой будет считываться со стандартного входного потока:
  • n:longint; {количество пар чисел};
  • объявим сами числа типа integer, переменную цикла — i — типа integer и дополнительные переменные, смысл которых будет объяснен ниже. Объявление сделаем в отдельных строках (так делать не обязательно), чтобы можно было ввести удобно комментарии:
  •  x,y: integer; {пара чисел}
     max: integer; {максимальное из пары}
     min: integer; {минимальное из пары}
     sum:longint; {сумма квадратов отобранных чисел}
     min_kvadr:longint; {мин. нечетная разница квадратов max и min}
     i:integer;
  • так как в задании не оговаривается, что пары чисел считывается из файла, значит их необходимо считать со стандартного входного потока оператором readln(); т.е. организуем цикл:
  • for i:=1 to n do begin
      readln(x,y);
      ...

    Допустим имеем пары:

    2 6
    4 1
    7 3
    2 9
    7 4
    
  • Чтобы получить в итоге максимальную сумму, то необходимо суммировать те числа из пар чисел, которые максимальны в паре, т.е. в нашем случае будем суммировать квадраты выделенных чисел из пар:
  • 2 6
    4 1
    7 3
    2 9
    7 4
    
  • но сначала определим максимальное и минимальное число из каждой пары:
  • if x>y then 
    begin 
       max:=x; min:=y 
    end
    else 
    begin 
        max:=y;min:=x 
    end;
  • далее суммируем квадраты максимальных чисел:
  • поскольку, согласно заданию, сумма должна быть нечетной, то в случае, если сумма будет четной, нам необходимо выбрать пару, в которой разница между квадратами чисел минимальна и при этом нечетна и взять из этой пары не максимальный, а минимальный элемент. Или лучше просто вычислить разницу между квадратами максимума и минимума и затем вычесть ее из получившейся четной суммы. Выделим пару, разница между квадратами чисел которой минимальна и при этом нечетна:
  • 2 6 - разница 32 (36 - 4)
    4 1 - разница 15 (16 - 1)
    7 3 - разница 40 (49 - 9)
    2 9 - разница 77 (81 - 4)
    7 4 - разница 33 (49 - 16)
    
  • поиск минимальной и нечетной разницы между квадратами чисел в паре:
  • if((max-min) mod 2 > 0) and ((sqr(max)-sqr(min)) < min_kvadr) then
        min_kvadr:=sqr(max) - sqr(min)
  • для переменной, обозначающей разницу, до цикла необходимо назначить максимально возможное значение:
  • min_kvadr:=1073676289;  {32 767 * 32 767 (самое большое в типе integer) }
  • таким образом, в цикле у нас происходит:
  • 1. поиск максимального и минимального числа из пары;
  • 2. вычисляется сумма максимальных чисел из каждой пары;
  • 3. находится минимальная разница квадратов максимального и минимального числа в парах.
  • после цикла необходимо проверить сумму на нечетность. Если сумма четная (чего НЕ должно быть по условию), то отнимем от суммы вычисленную минимальную разницу. Но при этом учтем, что если не нашлось нечетной минимальной разницы, то выводим 0 (по условию):
  • if sum mod 2 = 0 then begin
      if min_kvadr = 1073676289 then sum := 0
      else sum:=sum - min_kvadr
    end;

Эффективная программа на языке Паскаль (версия Pascal ABC):

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
var
 n:longint; {количество пар чисел}
 x,y: integer; {пара чисел}
 max: integer; {максимальное из пары}
 min: integer; {минимальное из пары}
 sum:longint; {сумма квадратов отобранных чисел}
 min_kvadr:longint; {мин. нечетная разница квадратов max и min}
 i:integer;
begin
sum:=0;
readln(n);
min_kvadr:=1073676289;  {32 767 * 32 767, самое большое integer}
for i:=1 to n do begin
  readln(x,y);
  if x>y then begin max:=x; min:=y end
  else begin max:=y;min:=x end;
  sum:=sum+sqr(max);
  if((max-min) mod 2 > 0) and (sqr(max)-sqr(min) < min_kvadr) then
    min_kvadr:=sqr(max) - sqr(min)
end;
if sum mod 2 = 0 then begin
  if min_kvadr = 1073676289 then sum := 0
  else sum:=sum - min_kvadr
end;
writeln('sum=',sum)
end.

Пример работы программы:

3
1 4
2 4
3 4
sum=41

✎ Задание А (более легкое, 2 балла максимум):

  • так как в задании указано, что пар чисел ровно 5, то введем в программу константу n=5
  • Решение на языке Паскаль (версия PascalABC):

    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
    
    const n = 5; {количество пар чисел}
    var
    x,y: longint; {пара чисел}
    max_sum: longint; {максимальная из сумм}
    sum:array [1..15]of longint; {суммы квадратов всех комбинаций чисел}
    i,k:longint;
    begin
    readln(x,y);
    sum[1]:=sqr(x);
    sum[2]:=sqr(y);
    k:=3; {счетчик для сумм}
    for i:=2 to n do begin
      readln(x,y);
      sum[k]:=sum[k-2]+sqr(x);   {1 шаг: s3=s1+x*x}{2 шаг: s7=s4+x*x}
      sum[k+1]:=sum[k-2]+sqr(y); {1 шаг: s4=s1+y*y}{2 шаг: s8=s4+y*y}
      sum[k+2]:=sum[k-1]+sqr(x); {1 шаг: s5=s2+x*x}{2 шаг: s9=s6+x*x}
      sum[k+3]:=sum[k-1]+sqr(y); {1 шаг: s6=s2+y*y}{2 шаг: s10=s6+y*y}
      k:=k+4;
    end;
    max_sum:=sum[1];
    for i:=1 to n*n do
      if (sum[i]>max_sum) and (sum[i] mod 2 <>0) then max_sum:=sum[i];
    if (max_sum=sum[1]) and (max_sum mod 2 = 0) then max_sum:=0;
    writeln(max_sum)
    end.

Предлагаем также посмотреть объяснение данного 27 задания на видео:

📹 YouTube здесь
📹 Видеорешение на RuTube здесь


Набор данных, состоящих из троек чисел

27_2:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

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

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

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

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

Постарайтесь сделать программу эффективной по времени и по используемой памяти.

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

Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.

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

Как в варианте А, так и в варианте Б программа должна напечатать одно число — минимально возможную сумму, соответствующую условиям задачи (или 0, если такую сумму получить нельзя).

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

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

Входные данные
Для варианта А на вход программе подается 5 строк, каждая из которых содержит три натуральных числа, не превышающих 10000.

 
Пример входных данных для варианта А:

1 3 2
2 1 2
2 5 1
1 3 4
6 1 1

Для варианта Б на вход программе в первой строке подается количество троек чисел N (1<=N<=100000). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10000.
 
Пример входных данных для варианта Б:

5
1 3 2
2 1 2
2 5 1
1 3 4
6 1 1

Пример выходных данных для приведенных выше примеров входных данных:
6

Типовые задания для тренировки

✍ Решение:

✎ Задание Б (4 балла)

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

Пример правильной и эффективной программы для задания Б на языке Паскаль (версия PascalABC):

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
const
  aMax = 10000;{наибольшее возможное исходное число}
 
var
  N: longint; {количество троек}
  a, b, c, tmp: longint;{тройка чисел}
  s: longint;{сумма выбранных чисел}
  D_min: longint;{мин. разница в тройке не кратная 5}
  i: longint;{}
 
begin
  s := 0;
  D_min := aMax + 1;
  readln(N);
  for i := 1 to N do 
  begin
    readln(a, b, c);
    if (a > b) then begin tmp := a;a := b;b := tmp end;
    if(b > c) then begin
      tmp := b;b := c;c := tmp;
      if (a > b) then begin tmp := a;a := b;b := tmp end
    end; {a,b,c отсортированы по возрастанию}
    s := s + a;
    if((b - a) mod 5 > 0 ) and ((b - a) < D_min) then D_min := b - a;
    if((c - a) mod 5 > 0 ) and ((c - a) < D_min) then D_min := c - a
  end;
  if s mod 5 = 0 then begin
    if D_min > aMax then s := 0
    else s := s + D_min
  end;
  writeln(s)
end.

✎ Задание А (2 балла)

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

На языке Паскаль (версия PascalABC):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var
  a: array[1..5, 1..3] of longint; 
  i1, i2, i3, i4, i5: longint; 
  s, sMin: longint;
 
begin
  for i1 := 1 to 5 do 
    readln(a[i1, 1], a[i1, 2], a[i1, 3]); 
  sMin := 100000; 
  for i1 := 1 to 3 do 
    for i2 := 1 to 3 do 
      for i3 := 1 to 3 do
        for i4 := 1 to 3 do
          for i5 := 1 to 3 do 
          begin
            s := a[1, i1] + a[2, i2] + a[3, i3] + a[4, i4] + a[5, i5];
            if (s mod 5 = 0) and (s < sMin) then 
              sMin := s
          end;
  if (sMin = 100000) then 
    sMin := 0; 
  writeln(sMin)
end.

Анализ пар, находящихся на расстоянии

27_3: Разбор 27 задания демоверсии 2019 года (ФИПИ):

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4 (разница в индексах элементов пары должна быть 4 или более, порядок элементов в паре неважен).
Необходимо определить количество таких пар, для которых произведение элементов делится на 29.

Описание входных и выходных данных:
В первой строке входных данных задаётся количество чисел N (4 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна вывести одно число: количество пар элементов, находящихся в последовательности на расстоянии не меньше чем 4, в которых произведение элементов кратно 29.

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

7
58
2
3
5
4
1
29

Пример выходных данных для приведённого выше примера входных данных:

5

Из 7 заданных элементов с учётом допустимых расстояний между ними можно составить 6 произведений:

58·4 = 232     :29=8
58·1 = 58      :29=2
58·29 = 1682   :29=58
2·1 = 2
2·29 = 58      :29=2
3·29 = 87      :29=3

Из них на 29 делятся 5 произведений.

Требуется написать эффективную по времени и памяти программу для решения описанной задачи.

✍ Решение:
 

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

✎ Программа на языке Паскаль (версия PascalABC). Программа неэффективна ни по времени, ни по памяти (2 балла):

  • Перебор всех вариантов произведений:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    const
      s = 4;//требуемое расстояние
     
    var
      n, i, j, cnt: integer;
      a: array[1..1000] of integer;
     
    begin
      readln(n);
      cnt := 0;
      for i := 1 to n do
        readln(a[i]);
      for i := 1 to n - s do
        for j := i + s to n do
          if a[i] * a[j] mod 29 = 0 then
            cnt := cnt + 1;
      writeln(cnt)
    end.

✎ Программа на языке Паскаль (версия PascalABC). Программа эффективна и по времени, и по памяти (4 балла):

  • Если один из сомножителей делится без остатка на 29, то произведение с любым другим сомножителем тоже будет делится на 29.
  • Последние рассматриваемые 4 элемента можно хранить как 4 счётчика: количество делящихся на 29 среди всех считанных чисел, всех считанных чисел без последнего, всех считанных чисел без 2 последних, всех считанных чисел без 3 последних, – и также сдвигать их после очередного шага.
  • 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
    
    const
      s = 4;//требуемое расстояние
     
    var
      n,i: integer;
      n1, n2, n3, n4: integer; //хранение последних s счетчиков
      a_: integer; //очередное значение
      cnt: integer;//количество искомых пар
     
    begin
      readln(n);
      n1 := 0;n2 := 0;n3 := 0;n4 := 0;
      cnt := 0;
      for i := 1 to n do 
      begin
        readln(a_); // очередное значение
        if i > s then
          if a_ mod 29 = 0 then
            cnt := cnt + (i - s)
          else
            cnt := cnt + n4;
        // сдвигаем элементы счетчика
        n4 := n3;
        n3 := n2;
        n2 := n1;
        // обновляем счетчик кратных 29
        if a_ mod 29 = 0 then
          n1 := n1 + 1;
      end;
      writeln(cnt)
    end.

Смотрите видео разбора демоверсии 2019 года задание 27:
📹 YouTube здесь

Видео на RuTube здесь


27_5:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  
Датчик передаёт каждую секунду по каналу связи неотрицательное целое число, не превосходящее 1000, — текущий результат измерений. Временем, в течение которого происходит передача, можно пренебречь.
Необходимо найти в заданной серии показаний датчика минимальное чётное произведение двух показаний, между моментами передачи которых прошло не менее 8 секунд. Если получить такое произведение не удаётся, ответ считается равным -1. Общее количество показаний датчика в серии не превышает 10 000.

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

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

ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ А. Максимальная оценка за выполнение задания А — 2 балла.


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

ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ Б. Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.
Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.

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

10
5 4
3 2 1
6
7
8 9
4

Программа должна вывести одно число — описанное в условии произведение, либо -1, если получить такое произведение не удаётся.
Пример выходных данных для приведённого выше примера входных данных:

16

✍ Решение:
 

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

    ✎ Задание А (решение на языке Паскаль, версия pascalABC):
    Ниже приводится пример переборного решения на Паскале, неэффективного ни по памяти, ни по времени, но являющегося правильным ответом на задание А.

    const
      s = 8;{требуемое расстояние между показаниями} 
     
    var
      N: integer;
      a: array[1..10000] of integer; {все показания датчика} 
      mp: integer; {минимальное значение произведения} 
      i, j: integer;
     
    begin
      readln(N);
      {Ввод значений датчика} 
      for i := 1 to N do 
        readln(a[i]); 
      mp := 1000 * 1000 + 1;
      for i := 1 to N - s do 
      begin
        for j := i + s to N do 
        begin
          if (a[i] * a[j] mod 2 = 0) and (a[i] * a[j] < mp) then 
            mp := a[i] * a[j]
        end;
      end;
      if mp = 1000 * 1000 + 1 then 
        mp := -1; 
      writeln(mp)
    end.

✎Задание Б (решение на языке Паскаль, версия pascalABC):

Чтобы произведение было чётным, хотя бы один сомножитель должен быть чётным, поэтому при поиске подходящих произведений чётные показания прибора можно рассматривать в паре с любыми другими, а нечётные — только с чётными.

Для каждого показания с номером k, начиная с k = 9, рассмотрим все допустимые по условиям задачи пары, в которых данное показание получено вторым. Минимальное произведение из всех этих пар будет получено, если первым в паре будет взято минимальное подходящее показание среди всех, полученных от начала приёма и до показания с номером k — 8. Если очередное показание чётное, минимальное среди предыдущих может быть любым, если нечётное — только чётным.

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

const
  s = 8; {требуемое расстояние между показаниями}
  amax = 1001;{больше максимально возможного показания}
 
var
  N: integer;
  a: array[1..s] of integer; {хранение s показаний датчика} 
  a_: integer; {ввод очередного показания} 
  ma: integer; {минимальное число без s последних} 
  me: integer; {минимальное чётное число без s последних} 
  mp: integer; {минимальное значение произведения} 
  p: integer;
  i, j: integer;
 
begin
  readln(N);
  {Ввод первых s чисел}
  for i := 1 to s do readln(a[i]);
  {Ввод остальных значений, поиск минимального произведения} 
  ma := amax;me := amax;mp := amax * amax;
  for i := s + 1 to N do 
  begin
    readln(a_);
    if a[1] < ma then ma := a[1];
    if (a[1] mod 2 = 0) and (a[1] < me) then me
    := a[1];
    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;
    {сдвигаем элементы вспомогательного массива влево}
    for j := 1 to s - 1 do
      a[j] := a[j + 1];
    a[s] := a_
  end;
  if mp = amax * amax then mp := -1;
  writeln(mp)
end.

Эта статья посвящена 27 заданию из ЕГЭ по информатике 2023.

В этой статье собраны некоторые задачи из 27 задания ЕГЭ по информатике, где нужно анализировать делимость чисел.

Приятного чтения!

Перейдём к практике 27 задания из ЕГЭ по информатике.

Задача (Демонстрационный вариант 2021)

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

Программа должна напечатать одно число – максимально возможную
сумму, соответствующую условиям задачи.

Входные данные.

Даны два входных файла (файл A и файл B), каждый из которых содержит
в первой строке количество пар N (1 ≤ N ≤ 100000). Каждая из следующих
N строк содержит два натуральных числа, не превышающих 10000

Пример организации исходных данных во входном файле:

6
1 3
5 12
6 9
5 4
3 3
1 1

Для указанных входных данных значением искомой суммы должно быть
число 32.

В ответе укажите два числа: сначала значение искомой суммы для файла А,
затем для файла B.

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

Решение:

Напишем программу на языке программирования Python для решения этого 27 задание из Демонстрационного варианта ЕГЭ по информатике.

f=open('27-B.txt')

n=int(f.readline())
delta=10001
sm=0

for i in range(n):
    a=f.readline().split()
    x, y = int(a[0]), int(a[1])

    if x>y:
        sm=sm+x
    else:
        sm=sm+y

    if (abs(x-y) < delta) and (abs(x-y) % 3 != 0):
        delta = abs(x-y)

if sm%3 != 0:
    print(sm)
else:
    print(sm-delta)

Найдём максимальную сумму в переменную sm, выбирая из каждой пары максимальное число. В переменной delta будем хранить минимальную разницу между числами в паре, которая НЕ делится на 3.

Если максимальная сумма делится на 3, то мы должны отнять переменную delta от максимальной суммы. Это означает, что мы заменили какое-то число суммы на другой элемент из той же пары. При этом новое значение точно не будет делиться на 3, ведь delta не делится на 3. Значение delta — это минимальная разница между числами в парах, следовательно, сумма будет максимально возможной.

Ответ:

Задача (Тройки чисел)

Набор данных состоит из троек натуральных чисел. Необходимо распределить все числа на три группы, при этом в каждую группу должно попасть ровно одно число из каждой исходной тройки. Сумма всех чисел в первой группе должна быть чётной, во второй — нечётной. Определите минимально возможную сумму всех чисел в третьей группе.

Входные данные:

Первая строка входного файла содержит число N — общее количество троек в наборе. Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

Пример входного файла:
3
1 2 3
8 12 4
6 9 7

Для указанных данных искомая сумма равна 11, она соответствует такому распределению чисел по группам: (2, 8, 7), (3, 12, 9), (1, 4, 6).

Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. В ответе укажите два числа: сначала значение искомой суммы для файла A, затем для файла B.

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

Источник задачи: https://inf-ege.sdamgia.ru/

Решение:

Запрограммируем задачу на языке программирования Pascal ABC.

f=open('27-A.txt')

n=int(f.readline())

delta=10001

sm1=0
sm2=0
sm3=0

for i in range(n):
    a=f.readline().split()
    x, y, z = int(a[0]), int(a[1]), int(a[2])

    mn = min(x, y, z)

    sm1 = sm1 + mn

    if x == mn:
        sm2 = sm2 + y
        sm3 = sm3 + z
    else:
        if y == mn:
            sm2 = sm2 + x
            sm3 = sm3 + z
        else:
            if z == mn:
                sm2 = sm2 + x
                sm3 = sm3 + y

    if x != mn and x - mn < delta and (x - mn)%2 != 0:
        delta = x-mn
    
    if y != mn and y - mn < delta and (y - mn)%2 != 0:
        delta = y-mn

    if z != mn and z - mn < delta and (z - mn)%2 != 0:
        delta = z-mn

    
if (sm2 + sm3)%2 != 0:
    print(sm1)
else:
    print(sm1+delta)

В переменную sm1 будем суммировать минимальные числа из каждой тройки. В переменные sm2 и sm3 распределяем оставшиеся числа из каждой тройки в произвольном порядке.

Переменная delta — это минимальная разница между наименьшим элементом и двумя оставшимися числами в тройке. Переменная delta — это наименьшая вышеуказанная разница среди всех троек, причём, она должна быть нечётной.

Если сумма переменных sm2 и sm3 будет нечётной, то условие задачи уже выполняется. Пример: 3 + 2 = 5 (т.е. сумма чётного числа и нечётного числа даёт нечётное число). Или 4 + 3 = 7. Здесь название первой, второй и третей группы весьма условны.

Если же сумма переменных sm2 и sm3 чётная, то нужно заменить одно число из sm1 числом из sm2 или sm3. После замены наша сумма sm1 увеличится на значение delta. Нам не обязательно понимать, из какой группы сделали замену, т.к. всё равно мы меняем число из той группы, где получилось значение delta.

Из-за того, что delta — это нечётное число, то чётность суммы той группы, откуда мы сделали замену, изменится. Если у нас были две чётные группы, то одна станет чётной, а другая станет нечётной. Тоже самое касается и другого случая, когда у нас были две нечётные группы, то после замены опять одна станет чётная, а другая нечётная группа. Таким образом, после замены, условие задачи будет выполнено, и в переменной sm1 будет минимально возможная сумма при данных обстоятельствах.

Ответ:

Задача(Тройки чисел, тренируем мозги)

Дана последовательность, которая состоит из троек натуральных чисел. Необходимо распределить все числа на три группы, при этом в каждую группу должно попасть ровно одно число из каждой исходной тройки. Сумма всех чисел как в первой, так и во второй группе должна быть нечётной. Определите максимально возможную сумму всех чисел в третьей группе.

Входные данные. Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 100000). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10000.

Пример входного файла:
3
1 3 8
9 12 4
7 11 10

Для указанных данных искомая сумма равна 31, она соответствует такому распределению чисел по группам: (1, 9, 7), (3, 4, 10), (8, 12, 11).

В ответе укажите два числа: сначала искомое значение для файла А, затем для файла B.

Источник задачи: https://kpolyakov.spb.ru/

Решение:

Распределим числа на три группы, как в прошлой задаче. В первую и во вторую группу числа распределяем из тройки случайно, а в третью берём максимальное число.

1) Случай, когда в первой и второй группе разная чётность.

Первая группа Вторая группа Третья группа
Сумма чётная Сумма нечётная Максимальная сумма

В этом случае нет смысла менять числа из первой и второй группы. Если мы заменим два чётных числа, сумма первой и второй группы никак не поменяется. Если поменяем два числа с разной чётностью, то обе группы поменяют свою чётность. Где-то «лишняя единица» добавится, а где-то уберётся.

Когда меняем числа, имеем в виду, что речь идёт в пределах одной тройки.

Поэтому в этом случае нужно менять число из группы с максимальной суммой.

2) Случай, когда в первой и второй группе сумма чётная.

Первая группа Вторая группа Третья группа
Сумма чётная Сумма чётная Максимальная сумма

Здесь мы можем поменять два числа из первой и второй группы между собой, но эти два числа должны быть разной чётности (разность чисел по модули должна быть нечётной). Тогда из одной суммы уйдёт «лишняя единица», а в другую добавится, и тогда обе суммы станут нечётной.

Если у нас не окажется два числа разной чётности в пределах одной тройки для первой и второй группы, значит, нужно для обеих групп искать замены из третьей группы с максимальной суммой.

Узнаём какие же будут суммы в первой и второй группе.

f=open('27a.txt')

n=int(f.readline())

sm1=0
sm2=0
sm3=0

for i in range(n):
    a=f.readline().split()
    x, y, z = int(a[0]), int(a[1]), int(a[2])

    mx = max(x, y, z)

    sm3 = sm3 + mx

    if x == mx:
        sm2 = sm2 + y
        sm1 = sm1 + z
    else:
        if y == mx:
            sm2 = sm2 + x
            sm1 = sm1 + z
        else:
            if z == mx:
                sm2 = sm2 + x
                sm1 = sm1 + y

    
print(sm1%2, sm2%2)

Программа распечатала два нуля.

В файле a получается, что первая и вторая группа имеют чётные суммы. Теперь посмотрим, есть ли нечётная разница двух чисел в этих группах в пределах одной тройки.

f=open('27a.txt')

n=int(f.readline())

sm1=0
sm2=0
sm3=0

delta = 0

for i in range(n):
    a=f.readline().split()
    x, y, z = int(a[0]), int(a[1]), int(a[2])

    mx = max(x, y, z)

    sm3 = sm3 + mx

    if x == mx:
        sm2 = sm2 + y
        sm1 = sm1 + z
        if abs(y-z)%2!=0:
            delta=abs(x-z)
    else:
        if y == mx:
            sm2 = sm2 + x
            sm1 = sm1 + z
            if abs(x-z)%2!=0:
                delta=abs(x-z)
        else:
            if z == mx:
                sm2 = sm2 + x
                sm1 = sm1 + y
                if abs(x-y)%2!=0:
                    delta=abs(x-y)
    
    
print(sm1%2, sm2%2, delta)

Получается, что переменная delta осталась равной нулю, следовательно, нет такой пары, где числа были бы разной чётности в пределах одной тройки.

Переменную delta ищем не обязательно минимальной.

Получается, мы должны заменить одно число из первой группы, одно число из второй группы на числа из третьей группы с максимальной суммой. Замены на этот раз нужно производить из разных троек, т.к. мы не можем одно число из третьей группы отдать, и в первом случае и во втором случае.

Разница между заменяемыми числами должна быть минимальной и нечётной. Минимальной она должна быть из-за того, что мы хотим оставить сумму в третьей группе как можно большей.

f=open('27a.txt')

n=int(f.readline())

sm1=0
sm2=0
sm3=0

a1=[]
a2=[]

for i in range(n):
    a=f.readline().split()
    x, y, z = int(a[0]), int(a[1]), int(a[2])

    mx = max(x, y, z)

    sm3 = sm3 + mx

    if x == mx:
        sm2 = sm2 + y
        sm1 = sm1 + z
        if (x-y)%2!=0:
            a1.append((x-y, i))
        if (x-z)%2!=0:
            a2.append((x-z, i))

    else:
        if y == mx:
            sm2 = sm2 + x
            sm1 = sm1 + z

            if (y-x)%2!=0:
                a1.append((y-x, i))
            if (y-z)%2!=0:
                a2.append((y-z, i))


        else:
            if z == mx:
                sm2 = sm2 + x
                sm1 = sm1 + y

                if (z-x)%2!=0:
                    a1.append((z-x, i))
                if (z-y)%2!=0:
                    a2.append((z-y, i))


a1.sort()
a2.sort()

    
print(sm3)
print(a1[:10])
print(a2[:10])

Получается следующий результат.

ЕГЭ по информатике - Задание 27 (минимальная разница чисел)

Первый список a1 отвечает за первую группу. Второй список a2 за вторую группу. В них кладём разницу между элементами из первой, второй группы и максимальным элементом тройки. При добавлении сохраняем ещё номер тройки, чтобы не заменить в итоге одно число для первой и второй группы.

После этого сортируем по первому числу списки a1 и a2, для того чтобы найти минимальную разницу для каждой группы.

Максимальная сумма до замен равна 3032. После замены элемента из первой группы наша сумма sm3 уменьшится на 17. После замены элемента из второй группы наше сумма sm3 уменьшится на 19. Мы видим, что производим замены из разных троек, поэтому ответ для файла a получается 3032 — 19 — 17 = 2996.

В третьей программе получается:

ЕГЭ по информатике - Задание 27 (минимальная разница чисел) файл b

В файле b получается 454694534 — 27 — 25 = 454694482.

Второе число в списке гарантирует, что мы делаем замены из разных троек.

Ответ:

0 / 0 / 0

Регистрация: 18.06.2020

Сообщений: 1

1

18.06.2020, 22:59. Показов 28070. Ответов 9


Дана последовательность целых положительных чисел. Рассматриваются все пары элементов последовательности, сумма которых делится на m=80 Среди всех таких пар нужно найти и вывести пару с максимальным произведением элементов. Если одинаковое максимальное произведение имеют несколько пар, можно вывести любую из них. Если подходящих пар в последовательности нет, нужно вывести два нуля.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (2<=N<=10000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10000
Пример входных данных:
8
10
30
50
40
60
70
90
80
Пример выходных данных для приведённого выше примера входных данных: 70 90

Пояснение. Из данных восьми чисел можно составить три пары, удовлетворяющие условию: (10,70);(30,50); (70,90) Наибольшее произведение получается в паре (70,90)
Напишите эффективную по времени и по памяти программу для решения этой задачи.

Не могу разобраться с задачей

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



DobroAlex

Заклинатель змей

611 / 508 / 213

Регистрация: 30.04.2016

Сообщений: 2,412

18.06.2020, 23:28

2

watermelon0876, самое простое и очевидное решение(писано с телефона, может быть с ошибками)

Python
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
#  code goes here
 
from typing import List, Tuple
 
numbers: List[int]= []
N = int(input())
 
for j in range (N):
   numbers.append(int(input()))
  
all_tuples:List[Tuple[int, int]]=[]
 
for j in range (N):
   for k in range (N):
      if j==k:
         continue
      if (numbers [j] + numbers [k]) % 80 == 0:
         all_tuples.append((numbers [j], numbers [k]))
if not all_tuples:
   print ("0 0")
   exit(0)
 
else:
   all_tuples.sort(key=lambda x: x[0] * x[1], reverse=True)
 
   print (f"{all_tuples[0][0]} {all_tuples[0][1]}")

Добавлено через 1 минуту
Меньше итераций

Python
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
#  code goes here
 
from typing import List, Tuple
 
numbers: List[int]= []
N = int(input())
 
for j in range (N):
   numbers.append(int(input()))
  
all_tuples:List[Tuple[int, int]]=[]
 
for j in range (N):
   for k in range (j,N):
      if j==k:
         continue
      if (numbers [j] + numbers [k]) % 80 == 0:
         all_tuples.append((numbers [j], numbers [k]))
if not all_tuples:
   print ("0 0")
 
else:
   all_tuples.sort(key=lambda x: x[0] * x[1], reverse=True)
 
   print (f"{all_tuples[0][0]} {all_tuples[0][1]}")

[



0



Вадим Тукаев

304 / 285 / 116

Регистрация: 23.01.2018

Сообщений: 933

19.06.2020, 05:08

3

Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Python
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
from functools import reduce
from operator import mul
 
a = [None] * 80
a[0] = []
a[40] = []
 
for i in (int(input()) for _ in range(int(input()))):
    r = i % 80
    if r == 0 or r == 40:
        a[r].append(i)
        if len(a[r]) == 3:
            a[r].sort(reverse=True)
            del a[r][-1]
    elif a[r] is None or i > a[r]:
        a[r] = i
 
m = (0, 0)
 
for i in range(0, 41):
    if i == 0 or i == 40:
        if len(a[i]) == 2:
            p = (a[i][0], a[i][1])
        else:
            continue
    else:
        p = (a[i], a[80-i])
    if all(p) and reduce(mul, p) > reduce(mul, m):
        m = p
 
print(*m)



1



Рыжий Лис

Просто Лис

Эксперт Python

4885 / 3199 / 1001

Регистрация: 17.05.2012

Сообщений: 9,376

Записей в блоге: 9

19.06.2020, 18:53

4

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ls = [10, 30, 50, 40, 60, 70, 90, 80]
m = 80 
 
# сложность O(n^2) или меньше
ls2 = []
for i in range(len(ls)):
    for j in range(i + 1, len(ls)):
        print(ls[i], ls[j])
        # сумма пары делится на 80
        if (ls[i] + ls[j]) % m == 0:
            ls2.append((ls[i], ls[j]))
print(ls2)
 
# Если подходящих пар в последовательности нет, нужно вывести два нуля.
if not ls2:
    print(0, 0)
    exit(0)
 
ls2.sort(key=lambda x: -x[0] * x[1])
print(ls2[0][0], ls2[0][1])

Впрочем, если хочется, сортировку можешь написать сам.

Добавлено через 3 часа 17 минут

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# хотя проверяющие ждут типа такого:
 
ls = [10, 30, 50, 40, 60, 70, 90, 80]
n = len(ls)
m = 80
 
a, b = 0, 0
r = 0  # оптимизация +доп.баллы
for i in range(n - 1):
    for j in range(i + 1, n):
        # print(ls[i], ls[j])
        if (ls[i] + ls[j]) % m == 0:
            if ls[i] * ls[j] > r:
                a = ls[i]
                b = ls[j]
                r = a * b
print(a, b)



0



Status 418

Эксперт Python

3343 / 1941 / 538

Регистрация: 26.11.2017

Сообщений: 4,693

Записей в блоге: 2

19.06.2020, 19:52

5

проверяющие ждут O(n) по времени и O(1) по памяти.



0



Просто Лис

Эксперт Python

4885 / 3199 / 1001

Регистрация: 17.05.2012

Сообщений: 9,376

Записей в блоге: 9

19.06.2020, 19:56

6

Ну последний вариант как раз О(1) по памяти (если не считать входные данные).

А процессор я затрудняюсь ответить. Где-то между О(n) и O(n^2)



0



304 / 285 / 116

Регистрация: 23.01.2018

Сообщений: 933

19.06.2020, 19:58

7

Цитата
Сообщение от eaa
Посмотреть сообщение

проверяющие ждут O(n) по времени и O(1) по памяти.

Мой алгоритм именно таков.



0



Status 418

Эксперт Python

3343 / 1941 / 538

Регистрация: 26.11.2017

Сообщений: 4,693

Записей в блоге: 2

19.06.2020, 20:40

8

я бы сделал через два буфера
a = [0] * m — для суммы
b = [0] * m — для произведения
и никаких sort, reduce и т.д



0



Вадим Тукаев

304 / 285 / 116

Регистрация: 23.01.2018

Сообщений: 933

20.06.2020, 04:27

9

Цитата
Сообщение от eaa
Посмотреть сообщение

я бы сделал через два буфера
a = [0] * m — для суммы
b = [0] * m — для произведения

Я не понял Вашу идею. Зачем нам два буфера? Тем более для суммы и для произведения? Нам не нужно ни то, ни другое. Нам нужно максимальное число для каждого остатка. Исключение — только для остатков 0 и 40, там нужно два максимума.

Цитата
Сообщение от eaa
Посмотреть сообщение

и никаких sort, reduce и т.д

Чем они Вам помешали? Сортируется максимум три элемента, это просто для того, чтобы оставить два наибольших числа.

Вот переписал немного попроще и покороче, без sort и reduce, хотя до сих пор не пойму, чем они Вам не угодили.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from heapq import heappop, heappush
from itertools import chain
 
a =[list() for _ in range(80)]
 
for i in (int(input()) for _ in range(int(input()))):
    r = i % 80
    heappush(a[r], i)
    if len(a[r]) > (2 if r == 0 or r == 40 else 1):
        heappop(a[r])
 
m = (0, 0)
 
for i in range(0, 41):
    p = tuple(a[i]) if i == 0 or i == 40 else tuple(chain(a[i], a[80-i]))
    if len(p) == 2 and p[0] * p[1] > m[0] * m[1]:
        m = p
 
print(*m)



0



eaa

Status 418

Эксперт Python

3343 / 1941 / 538

Регистрация: 26.11.2017

Сообщений: 4,693

Записей в блоге: 2

20.06.2020, 05:44

10

Цитата
Сообщение от Вадим Тукаев
Посмотреть сообщение

Чем они Вам помешали?

мне все равно, но обычному школьнику думаю будет сложно понять решение.

Добавлено через 4 минуты
вот начало:

Python
1
2
3
4
5
6
7
8
9
m = 80
n = int(input())
a = [0]*m
b = [0]*m
for _ in range(n):
  x = int(input())
  r = x % m
  a[r] += 1
  b[r] = ...



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

20.06.2020, 05:44

Помогаю со студенческими работами здесь

ЕГЭ по информатике
Всем привет! Я учусь в 10 ом классе, и у меня в школе на уроках информатики мы не заходили дальше…

ЕГЭ по информатике
Объясните, пожалуйста, что означает знак &quot;V&quot; и перевернутая &quot;V&quot; и знак &quot;_&gt;&quot; в следующем задании:

C4 ЕГЭ по информатике
Несколько дней пытаюсь понять
1)зачем второй раз дают одно и тоже условие `else if…

ЕГЭ по информатике
Здравствуйте! Кто из поситтителей данного форума сдавал в 11 классе информатику в форме ЕГЭ? Дело в…

ЕГЭ по информатике
Извините если не в ту тему написал, не могу понять куда лучше это написать.

На каком языке…

Подготовка к Егэ по информатике
Прошу не ругаться администрацию, если не там, где нужно, создал тему, ибо понятия не имею куда её…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

10

В принципе обращаюсь к тем кто сдавал/сдает ЕГЭ по информатике. Пишу все на Python и столкнулась с тем что велика разница в сложности между заданием 27 и всеми остальными. Готовлюсь по справочнику Полякова у него есть ответы к 27-му заданию на Питоне, но выглядят они мудрено и нет комментариев какая строка что делает. Прошла курсы по Python на Stepik и GeekBrains, все так же тяжело расшифровывать его решения.
Какими источниками вы пользовались для подготовки к этому заданию: статьи, справочники и т.д., корме Полякова?


  • Вопрос задан

    более трёх лет назад

  • 8580 просмотров

Пригласить эксперта

Основная суть 27-го задания — это разработка корректного алгоритма(чтобы получить максимальный балл) и его реализация на конкретном языке. Глубокие познания там не нужны, для решения хватит и базовых функций/операций. Больший упор при подготовке, как мне кажется, нужно делать именно на алгоритмы. Ну и решать как можно больше подобных заданий.

infbu.ru/catalog/1027

На примере этого задания:
Все полученные данные можно представить в виде списка неотрицательных целых чисел. От вас требуется пройти окошком ширины 5 этот список и посчитать сумму в каждом окошке.

Например:
Первое окно — это элементы с 0 по 4, второе — с 1 по 5, третье — с 2 по 6 и так далее вплоть до окна с (n-4) по n, в каждом по 5 элементов.

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


  • Показать ещё
    Загружается…

11 мар. 2023, в 00:01

15000 руб./за проект

10 мар. 2023, в 23:59

1000 руб./за проект

10 мар. 2023, в 23:52

7000 руб./за проект

Минуточку внимания

Компьютер наземной станции слежения получает от объектов-самолётов, находящихся в зоне её работы, идентификационные сигналы, представляющие собой последовательность из N целых положительных чисел. Каждый объект направляет на наземную станцию уникальное число, т. е. все числа в получаемой станцией последовательности различны. Обработка сигнала представляет собой рассмотрение всех пар различных элементов последовательности, при этом элементы пары не обязаны быть переданы непосредственно друг за другом, порядок элементов в паре не важен. Считается, что возникла одна критическая ситуация, если произведение элементов некоторой пары кратно 58.
Необходимо определить общее количество возникших критических ситуаций.
Пояснение:
Произведение двух чисел делится на 58, если выполнено одно из следующих условий (условия не могут выполняться одновременно). A. Оба сомножителя делятся на 58. Б. Один из сомножителей делится на 58, а другой не делится. B. Ни один из сомножителей не делится на 58, но один сомножитель делится на 2, а другой — на 29. Почему именно 2 и 29? Берем два делителя числа 58, произведение которых дает число 58: 2*29 = 58. При этом одно из них — наименьший делитель (в нашем случае 2), а другой, не должен делиться на первый найденный делитель (29/2 <> 0). Условие делимости произведения на 58 можно сформулировать проще, например так: (один из сомножителей делится на 58) ИЛИ (один сомножитель делится на 2, а другой — на 29) Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар. При вводе чисел можно определять, делится ли каждое из них на 58, 2 и 29, и подсчитывать следующие значения: n58 — количество чисел, кратных 58; n29 —количество чисел, кратных 29, но не кратных 2 и 58; n2 — количество чисел, кратных 2, но не кратных 29 и 58. Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков. Количество пар, удовлетворяющих условию А, можно вычислить по формуле n58*(n58 - 1)/2. Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n58*(N - n58). Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2 * n29. Поэтому искомое количество пар вычисляется по формуле: n58 * (n58 - 1)/2 + n58 * (N - n58) + n2 * n29

n=int(input()) n58,n29,n2=0,0,0 for i in range(n): a=int(input()) if a % 28 == 0: n58+=1 elif a % 29 == 0: n29+=1 elif a % 2 == 0: n2+=1 k58=n58 * (n58-1) // 2 + n58 * (n-n58) + n2 * n29 print(k58)



На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов делится на 26. Описание входных и выходных данных В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000. В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 26.

Пояснение:
Произведение двух чисел делится на 26, если выполнено одно из следующих условий (условия не могут выполняться одновременно). А. Оба сомножителя делятся на 26. Б. Один из сомножителей делится на 26, а другой не делится. В. Ни один из сомножителей не делится на 26, но один сомножитель делится на 2, а другой – на 13. Примечание для проверяющего. Условие делимости произведения на 26 можно сформулировать проще, например, так: (один из сомножителей делится на 26) ИЛИ (один сомножитель делится на 2, а другой – на 13). Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар. При вводе чисел можно определять, делится ли каждое из них на 26, 2 и 13, и подсчитывать следующие значения: 1) n26 – количество чисел, кратных 26; 2) n13 – количество чисел, кратных 13, но не кратных 26; 3) n2 – количество чисел, кратных 2, но не кратных 26. Примечание для проверяющего. Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков. Количество пар, удовлетворяющих условию А, можно вычислить по формуле n26·(n26 – 1)/2. Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n26·(N – n26). Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2·n13. Поэтому искомое количество пар вычисляется по формуле n26·(n26 – 1)/2 + n26·(N – n26) + n2·n13

n=int(input()) n26,n13,n2=0,0,0 for i in range(n): a=int(input()) if a % 26 == 0: n56+=1 elif a % 13 == 0: n13+=1 elif a % 2 == 0: n2+=1 k26=n26 * (n26-1) // 2 + n26 * (n-n26) + n2 * n13 print(k26)


# Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 3 и при этом была минимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число — минимально возможную сумму, соответствующую условиям задачи. f = open('27-B_demo.txt') n = int(f.readline()) s = 0 minn = 20001 d = 0 for i in range(n): x, y = map(int, f.readline().split()) s += min(x, y) d = abs(x-y) if d % 3 != 0: minn = min(d, minn) if s % 3 !=0: print(s) else: print(s+minn)

# Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 3 и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число — максимально возможную сумму, соответствующую условиям задачи f = open('27-B_demo.txt') n = int(f.readline()) s = 0 minn = 20001 for i in range(n): x, y = map(int, f.readline().split()) s += max(x, y) d = abs(x - y) if d % 3 != 0: minn = min(d, minn) if s % 3 != 0: print(s) else: print(s - minn)

nubs=list(map(int, open('27.txt').readline())) n=numbs[0] numbs.pop(0) count=0 ost=[0]*999 ost[0]=1 summa=0 for numb in numbs: summa+=numbs count+=ost[summa%999] print(count)

В текстовом файле записан набор натуральных чисел, не превышающих 108. Гарантируется, что все числа различны. Из набора нужно выбрать три числа, сумма которых делится на 3. Какую наибольшую сумму можно при этом получить?

Входные данные Первая строка входного файла содержит целое число ? – общее количество чисел в наборе. Каждая из следующих ? строк содержит одно число.

4
5
8
14
11

В данном случае есть две подходящие тройки: 5,14,11 (сумма 30) и 8,14,11 (сумма 33). В ответе надо записать число 33.

Вам даны два входных файла (? и ?), каждый из которых имеет описанную выше структуру. В ответе укажите два числа: сначала значение искомой суммы для файла ?, затем для файла ?.

data = sorted(list(map(int, open(r'./Data/27/ИН2010401-B.txt').read().splitlines()))[1:])
m01, m02, m03, m11, m12, m13, m21, m22, m23 = 0, 0, 0, 0, 0, 0, 0, 0, 0
for a in data:
    if a % 3 == 0:
        m03, m02, m01 = m02, m01, a
    if a % 3 == 1:
        m13, m12, m11 = m12, m11, a
    if a % 3 == 2:
        m23, m22, m21 = m22, m21, a
print(max(m01 + m02 + m03, m11 + m12 + m13, m01 + m11 + m21, m21 + m22 + m23))

ЕГЭ информатика 27 задание разбор, теория, как решать.

Создание программы для анализа числовых последовательностей, (В) — 2 балла

Е27.33 В городе M расположена кольцевая автодорога длиной в N километров

В городе M расположена кольцевая автодорога длиной в N километров с движением в обе стороны. На каждом километре автодороги расположены пункты приема мусора определенной вместимости. В пределах кольцевой дороги в одном из пунктов сборки мусора собираются поставить мусороперерабатывающий завод таким образом, чтобы стоимость доставки мусора была минимальной. Стоимость доставки мусора вычисляется, как вместимость пункта сбора …

Читать далее

Е27.32 определить количество таких подпоследовательностей, сумма элементов которых кратна 1111

Дана последовательность натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, состоящие более чем из ста элементов. Необходимо определить количество таких подпоследовательностей, сумма элементов которых кратна 1111. Входные данные Первая строка входного файла содержит целое число N – общее количество чисел в наборе. Каждая из следующих N строк содержит одно число. Гарантируется, что число в ответе не …

Читать далее

Е27.31 такие что сумма элементов каждой из них кратна k = 67

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 67. Найдите среди них подпоследовательность с максимальной суммой. Укажите в ответе найденную максимальную сумму. Входные данные Даны два входных файла (файл А и файл В), каждый из которых содержит в первой строке количество чисел …

Читать далее

Е27.30 Необходимо определить количество её непрерывных подпоследовательностей

Дана последовательность натуральных чисел. Необходимо определить количество её непрерывных подпоследовательностей, сумма элементов которых кратна 999. Входные данные Первая строка входного файла содержит целое число N – общее количество чисел в наборе. Каждая из следующих N строк содержит одно число. Гарантируется, что общая сумма всех чисел и число в ответе не превышают 2 ∙ 109. Вам …

Читать далее

Е27.29 сумма всех выбранных чисел имела такую же последнюю цифру

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

Читать далее

Е27.28 такие что сумма элементов каждой из них кратна k = 43

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 43. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них. Входные данные Даны два входных файла (файл A и …

Читать далее

Е27.27 последовательности, находящихся на расстоянии не меньше чем 5

последовательности, находящихся на расстоянии не меньше чем 5 На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 5 (разница в индексах элементов пары должна быть 5 или более, порядок элементов в паре неважен). Необходимо определить количество таких …

Читать далее

Е27.26 чтобы сумма всех выбранных чисел не делилась на 7

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

Читать далее

Е27.25 чтобы сумма всех выбранных чисел делилась на 4

чтобы сумма всех выбранных чисел делилась на 4. Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки два числа так, чтобы сумма всех выбранных чисел делилась на 4 и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число – максимально возможную сумму, соответствующую …

Читать далее

Е27.24 Определите максимально возможную сумму всех чисел в третьей группе

Определите максимально возможную сумму всех чисел в третьей группе. Набор данных состоит из троек натуральных чисел. Необходимо распределить все числа на три группы, при этом в каждую группу должно попасть ровно одно число из каждой исходной тройки. Сумма всех чисел в первой группе должна быть чётной, во второй – нечётной. Определите максимально возможную сумму всех …

Читать далее

Понравилась статья? Поделить с друзьями:
  • Как решать 27 задание егэ по биологии деление клетки
  • Как решать 27 задание егэ по биологии биосинтез белка
  • Как решать 25 задание егэ по обществознанию 2023
  • Как решать 25 задание егэ общество
  • Как решать 23 задание егэ по биологии геохронологическая таблица