Решение 27 задания егэ информатика excel

Привет! Продолжаем набирать форму к ЕГЭ по информатике 2023.

Сегодня рассмотрим некоторые тренировочные задачи из 27 задания ЕГЭ по информатике.

Изучим приём, как решать некоторые типы задач из 27 задания.

Задача (Изучим приём)

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

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

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

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

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

Решение:

Напишем программу на языке Python.

f=open('27_4a.txt')

n=int(f.readline())

sm = [0]*10

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

    sm2=[10**9]*10

    for j in range(10):

        r1=sm[j]+x
        r2=sm[j]+y

        sm2[r1%10] = min(r1, sm2[r1%10])
        sm2[r2%10] = min(r2, sm2[r2%10])

    sm=sm2

print(sm[6])

Чтобы проверить на что оканчивается положительное число, можно воспользоваться остатком от деления на 10.

Список sm — это минимальные суммы, для каждого остатка от деления на 10. Первая ячейка sm[0] — отвечает за минимальную сумму, которая может получится с остатком от деления на 10 равным нулю, вторая ячейка sm[1] — отвечает за минимальную сумму, которая может получится с остатком от деления на 10 равным единице и т.д.

Переменные x и y — числа очередной пары.

Для каждой пары заводим список sm2. Это минимальные суммы, которые могут получится с учётом конкретной пары для каждого остатка. Эти значения опираются на предыдущие значения sm. Приём похож на задание 18 из ЕГЭ по информатике. Там мы тоже опирались на два минимальных значения. Они уже минимальны, нет смысла перебирать все варианты, начиная с самого начала.

r1 — это прибавляем число x к сумме каждого остатка. r2 — это прибавляем число y к сумме каждого остатка.

Но числа r1 и r2 могут попасть не в ту же ячейку, которая была использована при получении этих чисел. Числа r1 и r2 могут обладать другими остатками при делении на 10.

В ячейку для конкретного остатка r1%10 мы выбираем минимальное значение из того, что там было, и нового претендента r1. Ведь r1 может «не победить» старое значение. Старые значения могли получится, когда мы это число x прибавляли к другим ячейкам списка sm. Нам нужно среди всех таких вариантов выбрать самое минимальное значение для ячейки конкретного остатка.

С переменной r2 делаем те же действия. Если у r2 будет такой же остаток (r2%10), как и r1, то всё равно в ячейку запишется самое маленькое значение.

В начале кладём в ячейки списка sm2 очень большое число (10**9), т.к. ищём минимальные значения.

Большие числа (10**9) могут перезаписаться в sm, если для какого-то остатка не удалось собрать сумму. Роли они не сыграют, т.к. проиграют всем по минимальности.

Таким образом, и число x, и число y пробуют провзаимодействовать с каждой из 10 ячеек списка sm. Два числа одновременно не смогут попасть в одну ячейку, и попадёт в эту ячейку самое маленькое значение.

Здесь используется именно новый список sm2 для каждой пары. Мы не можем и отталкиваться от списка sm и сразу обновлять этот список.

После окончания «ЦИКЛА с дестью остатками», список sm2 и будет содержать актуальную информацию для каждого остатка. В sm присваиваем sm2.

Шаг за шагом анализируем каждую пару. Раскладывать её «по спектру» на все 10 остатков. Списки sm и sm2 напоминают 17 задание из ЕГЭ по информатике, когда анализировали пары чисел.

Чтобы получить ответ, достаточно посмотреть в списке sm ячейку с индексом 6.

Ответ:

Задача (Закрепление)

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

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

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

6
6 1 9
4 8 11
9 4 6
2 8 3
10 3 5
1 4 5

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

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

Решение:

Напишем программу.

f=open('27_5a.txt')

n=int(f.readline())

sm = [0]*9

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

    sm2=[0]*9

    for j in range(9):

        r1=sm[j]+x+y
        r2=sm[j]+x+z
        r3=sm[j]+y+z
        
        if i==0 or sm[j]!=0:
            sm2[r1%9] = max(r1, sm2[r1%9])
            sm2[r2%9] = max(r2, sm2[r2%9])
            sm2[r3%9] = max(r3, sm2[r3%9])

    sm=sm2

print(sm[0])

Решение похоже на программу из предыдущей задачи. В прошлой раз нас интересовали остатки от деления на 10. Здесь нужно собирать максимальные суммы с разными остатками от деления на 9. В нулевой ячейке списка sm будет сидеть максимальная сумма, которая делится на 9.

Теперь мы заставляем провзаимодействовать два числа из каждой тройки с предыдущими суммами. Перебираем все варианты. Вместо функции min(), уже пишем max().

В начале кладём в ячейки списка sm2 нули, т.к. ищем максимальные значения.

Здесь так же добавлено условие: мы обновляем список sm2, если в ячейках sm, на которые опираемся, не ноль (это касается всех троек, кроме первой). Когда анализируем первую тройку во всех ячейках списка sm как раз и должны быть нули.

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

Это условие можно не писать, когда ищем минимальную сумму. Там после первого шага все нули перезапишутся большими числами из списка sm2. Они не будут порождать результаты, которые смогут соревноваться с реальными суммами по минимальности.

Ответ:

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

Задача (Отработаем навыки)

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

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

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

6
7 2 1
1 3 4
8 5 6
2 8 3
12 3 5
1 4 12

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

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

Решение:

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

f=open('27_6b.txt')

n=int(f.readline())

sm = [0]*6

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

    sm2=[0]*6

    for j in range(6):

        r1=sm[j]+x
        r2=sm[j]+y
        r3=sm[j]+z
        
        if i==0 or sm[j]!=0:
            sm2[r1%6] = max(r1, sm2[r1%6])
            sm2[r2%6] = max(r2, sm2[r2%6])
            sm2[r3%6] = max(r3, sm2[r3%6])

    sm=sm2

print(sm[0])

Ответ:

Мы сегодня посмотрели интересный приём, как решать некоторые задачи из ЕГЭ по информатике 27-ого задания. Удачи!

На уроке рассмотрен разбор 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 КЕГЭ информатика. Решение через Excel (тр.раб. от 22.10.2020)

Смотреть видео:

#информатика #егэинформатика #икт #экзамены #егэ_2020 #мгту #школьникам #помощь_студентам #поступление

Свежая информация для ЕГЭ и ОГЭ по Информатике (листай):

С этим видео ученики смотрят следующие ролики:

№27 КЕГЭ информатика. Решение через Excel (тр.раб. от10.12.2020)

№27 КЕГЭ информатика. Решение через Excel (тр.раб. от10.12.2020)

Елена Сергеевна

Информатика ЕГЭ 2021 задание 2 Демо ФИПИ 2020.08.24 решение с помощью Excel

Информатика ЕГЭ 2021 задание 2 Демо ФИПИ 2020.08.24 решение с помощью Excel

Информатика изи

№19-21 КЕГЭ информатика. Решение ТАБЛИЦЕЙ

№19-21 КЕГЭ информатика. Решение ТАБЛИЦЕЙ

Елена Сергеевна

Информатика ОГЭ 2020. Решение задания 14 ОГЭ по информатике 2020

Информатика ОГЭ 2020. Решение задания 14 ОГЭ по информатике 2020

Физика Информатика

Облегчи жизнь другим ученикам — поделись! (плюс тебе в карму):

11.01.2021

ЕГЭ информатика 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 Определите максимально возможную сумму всех чисел в третьей группе

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

Читать далее

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

Входные данные.
Даны два входных файла (файл ( A ) и файл ( B)), каждый из которых содержит в первой строке количество пар (N) ( ( 1 leqslant N leqslant 100000)). Каждая из следующих ( N ) строк содержит два натуральных числа, не превышающих ( 10, 000).
Пример организации исходных данных во входном файле:
(6)
(1,, 3)
(5,, 12)
(6,, 9)
(5,, 4)
(3,, 3)
(1,, 1)
Для указанных входных данных значением искомой суммы должно быть число ( 32 ).
В ответе укажите два числа: сначала значение искомой суммы для файла ( A ), затем для файла ( B).

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

Файл 27-A

Файл 27-B

У медицинской компании есть (N) пунктов приёма биоматериалов на анализ. Все пункты расположены вдоль автомагистрали и имеют номера, соответствующие расстоянию от нулевой отметки до конкретного пункта. Известно количество пробирок, которое ежедневно принимают в каждом из пунктов. Пробирки перевозят в специальных транспортировочных
контейнерах вместимостью не более (36) штук. Каждый транспортировочный контейнер упаковывается в пункте приёма и вскрывается только в лаборатории. Компания планирует открыть лабораторию в одном из пунктов. Стоимость перевозки биоматериалов равна произведению расстояния от пункта до лаборатории на количество контейнеров с
пробирками. Общая стоимость перевозки за день равна сумме стоимостей перевозок из каждого пункта в лабораторию. Лабораторию расположили в одном из пунктов приёма биоматериалов таким образом, что общая стоимость доставки биоматериалов из всех пунктов минимальна.

Определите минимальную общую стоимость доставки биоматериалов из всех пунктов приёма в лабораторию.

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

Дано два входных файла (файл (A) и файл (B)), каждый из которых в первой строке содержит число (N) ((1 leq N leq 10~000~000)) – количество пунктов приёма биоматериалов. В каждой из следующих (N) строк находится два числа: номер пункта и количество пробирок в этом пункте (все числа натуральные, количество пробирок в каждом пункте не превышает (1~000)). Пункты перечислены в порядке их расположения вдоль дороги, начиная от нулевой
отметки. В ответе укажите два числа: сначала значение искомой величины для файла (A), затем – для файла (B).

Типовой пример организации данных во входном файле

(6)
(1)    (100)
(2)    (200)
(5)    (4)
(7)    (3)
(8)    (2)
(10)    (190)

При таких исходных данных и вместимости транспортировочного контейнера, составляющей (96) пробирок, компании выгодно открыть лабораторию в пункте (2). В этом случае сумма транспортных затрат составит: (1 cdot 2 + 3 cdot 1 + 5 cdot 1 + 6 cdot 1 + 8 cdot 2 = 32).

Файлы с заданиями

Подготовка к ЕГЭ  Задание 27   Составитель: учитель информатики высшей квалификационной категории МАОУ «СОШ № 10» г. Миасса  Абрамова И.Б.

Подготовка к ЕГЭ Задание 27

Составитель: учитель информатики

высшей квалификационной категории

МАОУ «СОШ № 10» г. Миасса

Абрамова И.Б.

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

Кодификатор элементов содержания и требований к уровню подготовки выпускников образовательных организаций для проведения единого государственного экзамена по информатике и ИКТ

Возможные алгоритмические задачи для подраздела 1.1 перечня требований к уровню подготовки выпускников, достижение которых проверяется на едином государственном экзамене по информатике и ИКТ.

  • Нахождение минимума и максимума двух, трех, четырех данных чисел без использования массивов и циклов.
  • Нахождение всех корней заданного квадратного уравнения.
  • Запись натурального числа в позиционной системе с основанием, меньшим или равным 10. Обработка и преобразование такой записи числа.
  • Нахождение сумм, произведений элементов данной конечной числовой последовательности (или массива).
  • Использование цикла для решения простых переборных задач (поиск наименьшего простого делителя данного натурального числа, проверка числа на простоту и т.д.).
  • Заполнение элементов одномерного и двумерного массивов по заданным правилам.
  • Операции с элементами массива. Линейный поиск элемента. Вставка и удаление элементов в массиве. Перестановка элементов данного массива в обратном порядке. Суммирование элементов массива. Проверка соответствия элементов массива некоторому условию.
  • Нахождение второго по величине (второго максимального или второго минимального) значения в данном массиве за однократный просмотр массива.
  • Нахождение минимального (максимального) значения в данном массиве и количества элементов, равных ему, за однократный просмотр массива.
  • Операции с элементами массива, отобранных по некоторому условию (например, нахождение минимального четного элемента в массиве, нахождение количества и суммы всех четных элементов в массиве).
  • Сортировка массива.
  • Слияние двух упорядоченных массивов в один без использования сортировки.
  • Обработка отдельных символов данной строки. Подсчет частоты появления символа в строке.
  • Работа с подстроками данной строки с разбиением на слова по пробельным символам. Поиск подстроки внутри данной строки, замена найденной подстроки на другую строку.

Задача 1 (ИНФ_ДЕМО 2017) Вам предлагается два задания с похожими условиями: задание А ( 2 балла)  и задание Б ( 4 балла). Вы можете решать оба задания или одно из них  по своему выбору. Итоговая оценка выставляется как максимальная из оценок за задания А и Б. ИНФ-ДЕМО-2017

Задача 1 (ИНФ_ДЕМО 2017)

Вам предлагается два задания с похожими условиями:

  • задание А ( 2 балла) и
  • задание Б ( 4 балла).

Вы можете решать оба задания или одно из них по своему выбору.

Итоговая оценка выставляется как максимальная из оценок за задания А и Б.

ИНФ-ДЕМО-2017

Задание А

Задание Б

Имеется набор данных, состоящий из 6 пар положительных целых чисел.

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

Имеется набор данных, состоящий из пар положительных целых чисел.

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

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

На вход программе подаётся шесть строк, каждая из которых содержит два натуральных числа, не превышающих 10 000.

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

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

На вход программе в первой строке подаётся количество пар N (1 ≤ N ≤ 100 000). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.

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

ИНФ-ДЕМО-2017

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

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

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

Задание Б

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

Задание А и Б Как в варианте А, так и в варианте Б программа должна напечатать одно число – максимально возможную сумму, соответствующую условиям задачи или 0, если такую сумму получить нельзя. НАПОМИНАЕМ! Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Задание А и Б

  • Как в варианте А, так и в варианте Б программа должна напечатать одно число – максимально возможную сумму, соответствующую условиям задачи или 0, если такую сумму получить нельзя.
  • НАПОМИНАЕМ! Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Задание А и Б Перед текстом программы кратко опишите Ваш алгоритм решения Укажите использованный язык  программирования и его версию (например, Free Pascal 2.6.4).

Задание А и Б

  • Перед текстом программы кратко опишите Ваш алгоритм решения
  • Укажите использованный язык программирования и его версию (например, Free Pascal 2.6.4).

Критерии оценивания задания А При решении задачи A программа верно находит требуемую сумму для любых 6 пар исходных данных.   2 Не выполнены условия, позволяющие поставить 2 балла . Из описания алгоритма и общей структуры программы видно, что экзаменуемый в целом правильно представляет путь решения задачи. 1

Критерии оценивания задания А

При решении задачи A программа верно находит требуемую сумму для любых 6 пар исходных данных.

2

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

1

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

Критерии оценивания задания Б

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

4

Критерии оценивания задания Б Программа в целом работает правильно для любых входных данных произвольного размера. Время работы пропорционально количеству введённых чисел. 3 Правильно указано, какие величины должны вычисляться по ходу чтения элементов последовательности чисел. Используемая память, возможно, зависит от количества прочитанных чисел (например, входные данные запоминаются в массиве  или другой структуре данных).

Критерии оценивания задания Б

Программа в целом работает правильно для любых входных данных произвольного размера.

Время работы пропорционально количеству введённых чисел.

3

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

Используемая память, возможно, зависит от количества прочитанных чисел

(например, входные данные запоминаются в массиве или другой структуре данных).

Критерии оценивания задания Б Программа работает в целом верно, эффективно или нет.  2 Из описания алгоритма и общей структуры программы видно, что экзаменуемый в целом правильно представляет путь решения задачи. Программа может быть неэффективна по времени и по памяти, например, все числа запоминаются в массиве и перебираются все возможные суммы,  то есть по сути  реализовано решение задачи А  без ограничений на количество ввёденных пар. 1 балл ставится также за решения, верные лишь в частных случаях. 1

Критерии оценивания задания Б

Программа работает в целом верно,

эффективно или нет.

2

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

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

1 балл ставится также за решения, верные лишь в частных случаях.

1

Решаем задачу как получится.

Решаем задачу как получится.

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

Вариант Б. Идея решения.

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

Задание Б. Алгоритм решения. Программа читает все данные один раз. В каждой паре определяется большее число Max и разность между бόльшим и меньшим числами пары d. После обработки очередной пары программа хранит два числа: s – сумму всех максимальных элементов прочитанных пар и D_min – наименьшую возможную разность , не кратную 3. Окончательным ответом будет значение s, если оно не делится на 3, и s – D_min в противном случае. Если s делится на 3, а D _min не определено (разность между числами во всех парах кратна 3), ответ в соответствии с условиями задачи считается равным 0.

Задание Б. Алгоритм решения.

Программа читает все данные один раз.

В каждой паре определяется большее число Max и разность между бόльшим и меньшим числами пары d.

После обработки очередной пары программа хранит два числа:

  • s – сумму всех максимальных элементов прочитанных пар и
  • D_min – наименьшую возможную разность , не кратную 3.

Окончательным ответом будет значение s, если оно не делится на 3, и s – D_min в противном случае.

Если s делится на 3, а D _min не определено (разность между числами во всех парах кратна 3), ответ в соответствии с условиями задачи считается равным 0.

Задание Б. Язык программирования PascalABC. сonst aMax = 10000 ; {наибольшее возможное число в исх. данных} Var i,  N : longint; {количество пар} a, b : longint; {пара чисел}  s : longint; {сумма выбранных чисел} Max : longint; {большее значение в паре}  Min : longint; {меньшее значение в паре}  d : longint; {Max – Min в паре} D_min : longint; {минимальная разница Max – Min, не кратная 3}  { для всех прочитанных пар } Begin s := 0; D_min := aMax + 1; readln(N);

Задание Б. Язык программирования PascalABC.

сonst aMax = 10000 ; {наибольшее возможное число в исх. данных}

Var i, N : longint; {количество пар}

a, b : longint; {пара чисел}

s : longint; {сумма выбранных чисел}

Max : longint; {большее значение в паре}

Min : longint; {меньшее значение в паре}

d : longint; {Max – Min в паре}

D_min : longint; {минимальная разница Max – Min, не кратная 3}

{ для всех прочитанных пар }

Begin

s := 0;

D_min := aMax + 1;

readln(N);

b then begin Max := a; Min := b end else begin Max := b; Min := a end; s := s + Max; if ((Max — Min) mod 3 0) and (Max — Min end; If (s mod 3 = 0) then If (D_min aMax) then s := 0 else s := s – D_min; writeln(s); end. » width=»640″

Задание Б. Язык программирования PascalABC.

for i := 1 to N do begin

readln(a, b);

if a b then begin Max := a; Min := b end

else begin Max := b; Min := a end;

s := s + Max;

if ((Max — Min) mod 3 0) and (Max — Min

end;

If (s mod 3 = 0) then

If (D_min aMax) then s := 0

else s := s – D_min;

writeln(s);

end.

sMax) then sMax := s ; end; writeln(sMax); end. » width=»640″

Задание А. Полный перебор.

var a: array[1..6, 1..2] of longint; s, sMax, i1, i2, i3, i4, i5, i6: longint;

Begin

for i1 := 1 to 6 do readln(a[i1,1], a[i1,2]);

sMax := 0;

for i1:=1 to 2 do

for i2:=1 to 2 do

for i3:=1 to 2 do

for i4:=1 to 2 do

for i5:=1 to 2 do

for i6:=1 to 2 do begin

s:=a[1,i1]+a[2,i2]+a[3,i3]+a[4,i4]+a[5,i5]+a[6,i6];

if (s mod 3 0) and (s sMax) then sMax := s ;

end;

writeln(sMax);

end.

Вариации на тему Задачи 1

Вариации на тему Задачи 1

Задача 2. (Т.Ф. Хирьянов) По каналу связи передаются положительные целые числа (0 – признак конца ввода, чисел не менее двух и не более 10000). Затем контрольное значение равное максимальному произведению двух чисел, которое кратно 7, но  не кратно 49. Если такое произведение получить нельзя,  то контрольное значение равно 1. Посчитайте количество переданных чисел, контрольное значение для полученных чисел и выведите отчёт: количество чисел, полученное контрольное значение, посчитанное контрольное значение, вывод: совпали или не совпали контрольные значения. количество чисел, полученное контрольное значение, посчитанное контрольное значение, вывод: совпали или не совпали контрольные значения. https://www.youtube.com/watch?v=mweuFxP4o-k&list=PL66kIi3dt8A5slbxnwIjiYHloR1VGE-UJ&index=43  Источник https://www.youtube.com/watch?v=mweuFxP4o-k&list=PL66kIi3dt8A5slbxnwIjiYHloR1VGE-UJ&index=43

Задача 2. (Т.Ф. Хирьянов)

По каналу связи передаются положительные целые числа (0 – признак конца ввода, чисел не менее двух и не более 10000).

Затем контрольное значение равное максимальному произведению двух чисел, которое кратно 7, но не кратно 49. Если такое произведение получить нельзя, то контрольное значение равно 1.

Посчитайте количество переданных чисел, контрольное значение для полученных чисел и выведите отчёт:

  • количество чисел, полученное контрольное значение, посчитанное контрольное значение, вывод: совпали или не совпали контрольные значения.
  • количество чисел,
  • полученное контрольное значение,
  • посчитанное контрольное значение,
  • вывод: совпали или не совпали контрольные значения.

https://www.youtube.com/watch?v=mweuFxP4o-k&list=PL66kIi3dt8A5slbxnwIjiYHloR1VGE-UJ&index=43

Источник https://www.youtube.com/watch?v=mweuFxP4o-k&list=PL66kIi3dt8A5slbxnwIjiYHloR1VGE-UJ&index=43

Примеры:

Примеры:

Задание A. Алгоритм решения. Сохраняем все исходные данные в массив А, а переданное значение контрольной суммы в переменную Checksum . Для подсчёта количества чисел в потоке ввода заводим переменную N и присваиваем ей начальное значение 0. Максимальное произведение кратное 7, но не кратное 49 будем записывать в переменную R и присвоим ей начальное значение 1. В цикле перебираем все возможные пары чисел и, если их произведение кратно 7 и не кратно 49 и при этом больше чем записано в R, записываем в R новый максимум, равный произведению данных чисел. Выводим ответ, согласно условию задачи.

Задание A. Алгоритм решения.

  • Сохраняем все исходные данные в массив А, а переданное значение контрольной суммы в переменную Checksum .
  • Для подсчёта количества чисел в потоке ввода заводим переменную N и присваиваем ей начальное значение 0.
  • Максимальное произведение кратное 7, но не кратное 49 будем записывать в переменную R и присвоим ей начальное значение 1.
  • В цикле перебираем все возможные пары чисел и, если их произведение кратно 7 и не кратно 49 и при этом больше чем записано в R, записываем в R новый максимум, равный произведению данных чисел.
  • Выводим ответ, согласно условию задачи.

Задание А. Язык программирования PascalABC . Var  A : array[1..10000] of longint;   N, x, R, Checksum, i, j, P : longint; Begin // ввод данных N :=0; readln(х); while x  0 do begin   N := N + 1;   a[N] := x;    readln(х); end; readln(Checksum);

Задание А. Язык программирования PascalABC .

Var A : array[1..10000] of longint;

N, x, R, Checksum, i, j, P : longint;

Begin

// ввод данных

N :=0;

readln(х);

while x 0 do begin

N := N + 1;

a[N] := x;

readln(х);

end;

readln(Checksum);

R) then R:= P; end; Writeln(‘Введено чисел ’, N); // вывод Writeln(‘Переданное контрольное значение ’, Checksum ); Writeln(‘Вычисленное контрольное значение ’, R); If R = Checksum then w riteln(‘Значения совпали’) else w riteln(‘Значения не совпали’); end. » width=»640″

Задание А. Продолжение программы.

R := 1; // вычисление контрольного значения

for i := 1 to N — 1 do

for j := i + 1 to N do begin

P := A[i] * A[j];

if (P mod 7 = 0) and (P mod 49 0) and (P R) then R:= P;

end;

Writeln(‘Введено чисел ’, N); // вывод

Writeln(‘Переданное контрольное значение ’, Checksum );

Writeln(‘Вычисленное контрольное значение ’, R);

If R = Checksum then w riteln(‘Значения совпали’)

else w riteln(‘Значения не совпали’);

end.

Задание Б. Алгоритм решения. Произведение двух чисел кратно 7 и не кратно 49, если: один из сомножителей кратен 7, но не кратен 49; второй сомножитель не кратен 7. Произведение будет максимальным если перемножить самое большое число не кратное 7 и самое большое число кратное 7, но не кратное 49 из потока ввода. По мере поступления чисел будем их считать (переменная N , начальное значение 0) и искать максимальные значения среди чисел не кратных 7 (переменная max , нач. значение 0) кратных 7, но не кратных 49 (переменная max7 , нач. значение 0) Вычисленная контрольная сумма R = max * max7, будет равна 0 если не было чисел не кратных 7 или кратных 7, но не кратных 49 и тогда контрольная сумма R должна быть равна 1 по условию задачи. Выводим ответы согласно условию задачи.

Задание Б. Алгоритм решения.

Произведение двух чисел кратно 7 и не кратно 49, если:

  • один из сомножителей кратен 7, но не кратен 49;
  • второй сомножитель не кратен 7.

Произведение будет максимальным если перемножить самое большое число не кратное 7 и самое большое число кратное 7, но не кратное 49 из потока ввода. По мере поступления чисел будем их считать (переменная N , начальное значение 0) и искать максимальные значения среди чисел

  • не кратных 7 (переменная max , нач. значение 0)
  • кратных 7, но не кратных 49 (переменная max7 , нач. значение 0)

Вычисленная контрольная сумма R = max * max7, будет равна 0 если не было чисел не кратных 7 или кратных 7, но не кратных 49 и тогда контрольная сумма R должна быть равна 1 по условию задачи.

Выводим ответы согласно условию задачи.

Задание Б. Язык программирования PascalABC. Var   x, N, max, max7, R, Checksum : longint; Begin N:=0;  // количество переданных чисел max:=0;  // максимальное число не кратное 7 max7:=0;  // максимальное число кратное 7, но    // не кратное 49 readln(х);  // x − текущее число из потока     // ввода

Задание Б. Язык программирования PascalABC.

Var

x, N, max, max7, R, Checksum : longint;

Begin

N:=0; // количество переданных чисел

max:=0; // максимальное число не кратное 7

max7:=0; // максимальное число кратное 7, но

// не кратное 49

readln(х); // x − текущее число из потока // ввода

max7) then max7 := x; if (x mod 7 0) and (x max) then max := x; readln(х); end; R := max * max7; If R = 0 then R := 1; readln(Checksum); Writeln(‘Введено чисел ’, N); Writeln(‘Переданное контрольное значение ’, Checksum ); Writeln(‘Вычисленное контрольное значение ’, R); If R = Checksum then w riteln(‘Значения совпали’) else w riteln(‘Значения не совпали’); end. » width=»640″

Задание Б. Продолжение программы.

while x 0 do begin

N := N + 1;

if (x mod 7 = 0) and (x mod 49 0) and (x max7) then max7 := x;

if (x mod 7 0) and (x max) then max := x;

readln(х);

end;

R := max * max7; If R = 0 then R := 1;

readln(Checksum);

Writeln(‘Введено чисел ’, N);

Writeln(‘Переданное контрольное значение ’, Checksum );

Writeln(‘Вычисленное контрольное значение ’, R);

If R = Checksum then w riteln(‘Значения совпали’)

else w riteln(‘Значения не совпали’);

end.

Задача 3. (ИНФ_ДЕМО 2014) По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно и не превышает 100000. Затем передаётся контрольное значение последовательности – наибольшее число R, удовлетворяющее следующим условиям: 1) R – произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел; допускаются произведения различных элементов последовательности, равных по величине); 2) R делится на 21. Если такого числа R нет, то контрольное значение полагается равным 0. Программа должна напечатать отчёт по следующей форме: Вычисленное контрольное значение: … Контроль пройден (или – Контроль не пройден)

Задача 3. (ИНФ_ДЕМО 2014)

По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно и не превышает 100000. Затем передаётся контрольное значение последовательности – наибольшее число R, удовлетворяющее следующим условиям:

1) R – произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел; допускаются произведения различных элементов последовательности, равных по величине);

2) R делится на 21.

Если такого числа R нет, то контрольное значение полагается равным 0.

Программа должна напечатать отчёт по следующей форме:

Вычисленное контрольное значение: …

Контроль пройден (или – Контроль не пройден)

Задача 3. Продолжение . На вход программе в первой строке подаётся количество чисел N.  В каждой из последующих N строк записано одно натуральное число, не   превышающее 1000.  В последней строке записано контрольное значение. Пример входных данных : 6 70 21 997 7 9 300 21000 Пример выходных данных для приведённого выше примера входных данных: Вычисленное контрольное значение: 21000 Контроль пройден

Задача 3. Продолжение .

На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не   превышающее 1000. В последней строке записано контрольное значение.

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

6

70

21

997

7

9

300

21000

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

Вычисленное контрольное значение: 21000

Контроль пройден

Задание A. Алгоритм решения. Сохраняем все исходные данные в массив А,  а переданное значение контрольной суммы в переменную Checksum  . Максимальное произведение кратное 21 будем записывать в переменную R и присвоим ей начальное значение 0. В цикле перебираем все возможные пары чисел и, если их произведение кратно 21 и при этом больше чем записано в R, записываем в R новый максимум, равный произведению данных чисел. Выводим ответ, согласно условию задачи.

Задание A. Алгоритм решения.

  • Сохраняем все исходные данные в массив А, а переданное значение контрольной суммы в переменную Checksum .
  • Максимальное произведение кратное 21 будем записывать в переменную R и присвоим ей начальное значение 0.
  • В цикле перебираем все возможные пары чисел и, если их произведение кратно 21 и при этом больше чем записано в R, записываем в R новый максимум, равный произведению данных чисел.
  • Выводим ответ, согласно условию задачи.

R) then R := a[i]*a[j]; writeln(‘Вычисленное контр.значение ’,R); if R = Checksum then writeln(‘Контроль пройден’) else writeln(‘Контроль не пройден’); end. » width=»640″

Задание А. Язык программирования PascalABC .

var N, i, j, R, Checksum : integer;

a: array[1..100000] of integer;

begin

readln(N);

for i:=1 to N do readln(a[i]);

readln(Checksum); R := 0;

for i:=1 to N-1 do

for j:=i+1 to N do

if (a[i]*a[j] mod 21 = 0) and (a[i]*a[j] R)

then R := a[i]*a[j];

writeln(‘Вычисленное контр.значение ’,R);

if R = Checksum then

writeln(‘Контроль пройден’)

else writeln(‘Контроль не пройден’);

end.

Задание Б. Алгоритм решения. Программа читает все входные данные один раз, не запоминая все данные в массиве. Программа для прочитанного фрагмента входной последовательности хранит значения четырёх величин: М7 – самое большое число, кратное 7, но не кратное 3; M3 – самое большое число, кратное 3, но не кратное 7; M21 – самое большое число, кратное 21; МAX – самое большое число среди всех элементов последовательности, отличное от М21 (если число М21 встретилось более одного раза и оно же является максимальным, то MAX = M21). После того как все данные прочитаны, искомое контрольное значение вычисляется как максимум из произведений (М21 * MAX) и (М7 * М3).

Задание Б. Алгоритм решения.

Программа читает все входные данные один раз, не запоминая все данные в массиве. Программа для прочитанного фрагмента входной последовательности хранит значения четырёх величин:

  • М7 – самое большое число, кратное 7, но не кратное 3;
  • M3 – самое большое число, кратное 3, но не кратное 7;
  • M21 – самое большое число, кратное 21;
  • МAX – самое большое число среди всех элементов последовательности, отличное от М21 (если число М21 встретилось более одного раза и оно же является максимальным, то MAX = M21).

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

(М21 * MAX) и (М7 * М3).

M7) then M7 := a; if (a mod 3 = 0) and (a mod 7 0) and (a M3) then M3 := a; if (a mod 21 = 0) and (a M21) then begin if M21 MAX then MAX := M21; M21 := a; end else if a MAX then MAX := a; end; » width=»640″

Задание Б. Язык программирования PascalABC .

var M7, M3, M21, R, MAX, a, res, i, N: longint;

begin

M7 := 0; M3 := 0; M21 := 0; MAX := 0;

readln(N);

for i := 1 to N do begin

readln(a);

if (a mod 7 = 0) and (a mod 3 0) and (a M7)

then M7 := a;

if (a mod 3 = 0) and (a mod 7 0) and (a M3)

then M3 := a;

if (a mod 21 = 0) and (a M21) then begin

if M21 MAX then MAX := M21;

M21 := a;

end

else

if a MAX then MAX := a;

end;

Задание Б. Продолжение программы. readln(R); if (M7*M3   res := M21*MAX else res := M7*M3; writeln('Вычисленное контр. значение: ',res); if R = res then writeln('Контроль пройден') else writeln('Контроль не пройден'); end.

Задание Б. Продолжение программы.

readln(R);

if (M7*M3

res := M21*MAX

else res := M7*M3;

writeln(‘Вычисленное контр. значение: ‘,res);

if R = res then writeln(‘Контроль пройден’)

else writeln(‘Контроль не пройден’);

end.

Задача ИНФ_ДЕМО 2018 На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов делится на 26. В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000. В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 26. Пример входных данных: 4 2 6 13 39 Пример выходных данных для приведённого выше примера входных данных: 4 Пояснение. Из четырёх заданных чисел можно составить 6 попарных произведений: 2·6, 2·13, 2·39, 6·13, 6·39, 13·39 (результаты: 12, 26, 78, 78, 234, 507). Из них на 26 делятся 4 произведения (2·13=26; 2·39=78; 6·13=78; 6·39=234).

Задача ИНФ_ДЕМО 2018

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

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

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

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

4

2

6

13

39

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

Пояснение. Из четырёх заданных чисел можно составить 6 попарных произведений: 2·6, 2·13, 2·39, 6·13, 6·39, 13·39 (результаты: 12, 26, 78, 78, 234, 507). Из них на 26 делятся 4 произведения (2·13=26; 2·39=78; 6·13=78; 6·39=234).

Задача 4 . (аналог ИНФ_ДЕМО 2018, Д.В. Богданов) Дан набор из N натуральных чисел. Необходимо определить количество пар элементов (a i , a j ) этого набора, в которых 1  i В первой строке входных данных задаётся количество чисел N  (1 ≤ N ≤ 10000). В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. Пример входных данных: 4 7 5 6 12 Пример выходных данных для приведённого выше примера входных данных: 5 В приведённом наборе из 4 чисел имеются пять пар (7, 6), (5, 6), (7, 12),  (5, 12), (6, 12), произведение элементов которых кратно 6. Источник http://kpolyakov.spb.ru/school/ege.htm сайт К.Ю. Полякова , автор Д.В. Богданов, задача № 75, аналогичная задача в ДЕМО 2018

Задача 4 . (аналог ИНФ_ДЕМО 2018, Д.В. Богданов)

Дан набор из N натуральных чисел. Необходимо определить количество пар элементов (a i , a j ) этого набора, в которых 1  i

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

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

4

7

5

6

12

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

5

В приведённом наборе из 4 чисел имеются пять пар (7, 6), (5, 6), (7, 12), (5, 12), (6, 12), произведение элементов которых кратно 6.

Источник http://kpolyakov.spb.ru/school/ege.htm сайт К.Ю. Полякова , автор Д.В. Богданов, задача № 75, аналогичная задача в ДЕМО 2018

Задание A. Алгоритм решения. Сохраняем все исходные данные в массив А. Для подсчёта количества пар в которых произведение кратно 6 заводим переменную count и присваиваем ей начальное значение 0. В цикле перебираем все возможные пары и, если их произведение кратно 6, увеличиваем count на 1. После цикла, в count будет подсчитано количество пар элементов, произведение которых кратно 6.  Его и выводим.

Задание A. Алгоритм решения.

  • Сохраняем все исходные данные в массив А.
  • Для подсчёта количества пар в которых произведение кратно 6 заводим переменную count и присваиваем ей начальное значение 0.
  • В цикле перебираем все возможные пары и, если их произведение кратно 6, увеличиваем count на 1.
  • После цикла, в count будет подсчитано количество пар элементов, произведение которых кратно 6. Его и выводим.

Задание А. Язык программирования PascalABC. var N, i, j, count : integer;  a: array[1..10000] of integer; begin  readln(N);  for i:=1 to N do  readln(a[i]);  count := 0;  for i:=1 to N-1 do  for j:=i+1 to N do  if a[i]*a[j] mod 6 = 0 then  count := count + 1;  writeln(count); end.

Задание А. Язык программирования PascalABC.

var N, i, j, count : integer;

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

begin

readln(N);

for i:=1 to N do

readln(a[i]);

count := 0;

for i:=1 to N-1 do

for j:=i+1 to N do

if a[i]*a[j] mod 6 = 0 then

count := count + 1;

writeln(count);

end.

Задание Б. Способ 1. Алгоритм решения. Произведение двух чисел кратно 6, если: один из сомножителей кратен 6 (второй может быть любым); ни один из сомножителей не кратен 6, но один из сомножителей кратен 2, а другой кратен 3. По мере поступления чисел будем накапливать количество таких, которые кратны 2, кратны 3 и кратны 6. Очередное число образует пары с предшествующими числами, при этом возможны следующие случаи: число кратно 6, образует пары со всеми числами; кратно 2, но не 3, образует пары с числами, кратными 3; кратно 3, но не 2, образует пары с числами, кратными 2; не кратно 2 и не кратно 3, образует пары с числами,  кратными 6. Определение, к какому случаю относится число, и подсчёт количества пар будем производить в цикле.

Задание Б. Способ 1. Алгоритм решения.

Произведение двух чисел кратно 6, если:

  • один из сомножителей кратен 6 (второй может быть любым);
  • ни один из сомножителей не кратен 6, но один из сомножителей кратен 2, а другой кратен 3.

По мере поступления чисел будем накапливать количество таких, которые кратны 2, кратны 3 и кратны 6.

Очередное число образует пары с предшествующими числами, при этом возможны следующие случаи:

  • число кратно 6, образует пары со всеми числами;
  • кратно 2, но не 3, образует пары с числами, кратными 3;
  • кратно 3, но не 2, образует пары с числами, кратными 2;
  • не кратно 2 и не кратно 3, образует пары с числами, кратными 6.

Определение, к какому случаю относится число, и подсчёт количества пар будем производить в цикле.

Задание Б. Язык программирования PascalABC. var i, a, ans, k, k2, k3, k6 : longint; begin  readln(k);  ans:=0;   {ответ}  k2:=0;  {количество чисел кратных 2, но    не кратных 6}  k3:=0;   {количество чисел кратных 3, но    не кратных 6}  k6:=0;   {количество чисел кратных 6}

Задание Б. Язык программирования PascalABC.

var i, a, ans, k, k2, k3, k6 : longint;

begin

readln(k);

ans:=0; {ответ}

k2:=0; {количество чисел кратных 2, но не кратных 6}

k3:=0; {количество чисел кратных 3, но не кратных 6}

k6:=0; {количество чисел кратных 6}

Задание Б. Продолжение программы.  for i := 1 to k do begin  readln(a); { очередное число}  if a mod 6 = 0 then begin   {если число кратно 6, то оно составляет пару  со всеми введенными ранее числами}  ans := ans + i - 1;  k6 := k6 + 1;    end  else  if a mod 3 = 0 then begin {иначе, если число кратно 3, то оно составляет  пару со всеми ранее введенными числами кратными 2}    a ns := ans + k2 + k6 ;    k3 := k3 + 1;     end

Задание Б. Продолжение программы.

for i := 1 to k do begin

readln(a); { очередное число}

if a mod 6 = 0 then begin

{если число кратно 6, то оно составляет пару

со всеми введенными ранее числами}

ans := ans + i — 1;

k6 := k6 + 1;

end

else if a mod 3 = 0 then begin

{иначе, если число кратно 3, то оно составляет пару со всеми ранее введенными числами кратными 2}

a ns := ans + k2 + k6 ;

k3 := k3 + 1;

end

Задание Б. Окончание программы. else   if a mod 2 = 0 then begin {иначе, если число кратно 2, то оно составляет пару со всеми ранее введенными числами кратными 3}    a ns := ans + k3 + k6 ;    k2:=k2+1;       end    else  {иначе (если не кратны 2, 3, 6), то оно  составляет пару с числами кратными 6}   a ns := ans + k6 ;  end;  writeln(ans); end.

Задание Б. Окончание программы.

else if a mod 2 = 0 then begin

{иначе, если число кратно 2, то оно составляет пару со всеми ранее введенными числами кратными 3}

a ns := ans + k3 + k6 ;

k2:=k2+1;

end

else

{иначе (если не кратны 2, 3, 6), то оно составляет пару с числами кратными 6}

a ns := ans + k6 ;

end;

writeln(ans);

end.

Задание Б. Способ 2. Алгоритм решения. По мере поступления чисел будем накапливать количество таких, которые кратны 6 (k6), кратны 3, но не кратны 6 (k3) и кратны 2, но не кратны 6 (k2). Каждое число учитывается только в одном из счётчиков. Произведение двух чисел кратно 6, если: оба сомножителя кратны 6, таких пар k6 * (k6 - 1) div 2 один из сомножителей кратен 6, а другой нет, таких пар  k6 * (k - k6) ни один из сомножителей не кратен 6, но один из сомножителей кратен 2, а другой кратен 3 , таких пар k2 * k3 . Искомое количество пар вычисляется по формуле k6 * (k6 - 1) div 2 + k6 * (k - k6) + k2 * k3. Можно считать и другими способами.

Задание Б. Способ 2. Алгоритм решения.

По мере поступления чисел будем накапливать количество таких, которые

  • кратны 6 (k6),
  • кратны 3, но не кратны 6 (k3) и
  • кратны 2, но не кратны 6 (k2).

Каждое число учитывается только в одном из счётчиков.

Произведение двух чисел кратно 6, если:

  • оба сомножителя кратны 6, таких пар k6 * (k6 — 1) div 2
  • один из сомножителей кратен 6, а другой нет, таких пар k6 * (k — k6)
  • ни один из сомножителей не кратен 6, но один из сомножителей кратен 2, а другой кратен 3 , таких пар k2 * k3 .

Искомое количество пар вычисляется по формуле

k6 * (k6 — 1) div 2 + k6 * (k — k6) + k2 * k3.

Можно считать и другими способами.

Задание Б. Язык программирования PascalABC. var i, a, k, k2, k3, k6 : longint; begin k2:=0; k3:=0; k6:=0; readln(k);  for i := 1 to k do begin  readln(a);  if a mod 6 = 0 then inc(k6) else if a mod 3 = 0 then inc(k3)    else if a mod 2 = 0 then inc(k2) ; end; writeln(k6*(k6-1) div 2 + k6*(k-k6) + k2*k3); end.

Задание Б. Язык программирования PascalABC.

var i, a, k, k2, k3, k6 : longint;

begin

k2:=0; k3:=0; k6:=0;

readln(k);

for i := 1 to k do begin

readln(a);

if a mod 6 = 0 then inc(k6)

else if a mod 3 = 0 then inc(k3)

else if a mod 2 = 0 then inc(k2) ;

end;

writeln(k6*(k6-1) div 2 + k6*(k-k6) + k2*k3);

end.

Задача 5. (автор Д.В. Богданов) Дан набор из N натуральных чисел. Необходимо определить количество пар элементов ( a i , a j ) этого набора, в которых 1   i j   N и сумма элементов кратна 12. В первой строке входных данных задаётся количество чисел N   (1 ≤ N ≤ 10000). В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. Пример входных данных: 5 7 5 6 12 24 Пример выходных данных для приведённого выше примера: 2 В приведённом наборе из 5 чисел имеются две пары (7, 5) и (12, 24), сумма элементов которых кратна 12. Источник http://kpolyakov.spb.ru/school/ege.htm сайт К.Ю. Полякова , автор Д.В. Богданов, задача № 77

Задача 5. (автор Д.В. Богданов)

Дан набор из N натуральных чисел. Необходимо определить количество пар элементов ( a i , a j ) этого набора, в которых 1  i j  N и сумма элементов кратна 12.

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

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

5

7

5

6

12

24

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

В приведённом наборе из 5 чисел имеются две пары (7, 5) и (12, 24), сумма элементов которых кратна 12.

Источник http://kpolyakov.spb.ru/school/ege.htm сайт К.Ю. Полякова , автор Д.В. Богданов, задача № 77

Задание A. Алгоритм решения. Сохраняем все исходные данные в массив А. Для подсчёта количества пар в которых сумма кратна 12 заводим переменную count и присваиваем ей начальное значение 0. В цикле перебираем все возможные пары и, если их сумма кратна 12, добавляем 1 в count. После цикла, в count будет подсчитано количество пар элементов, сумма которых кратна 12. Выводим ответ, который записан в count.

Задание A. Алгоритм решения.

  • Сохраняем все исходные данные в массив А.
  • Для подсчёта количества пар в которых сумма кратна 12 заводим переменную count и присваиваем ей начальное значение 0.
  • В цикле перебираем все возможные пары и, если их сумма кратна 12, добавляем 1 в count.
  • После цикла, в count будет подсчитано количество пар элементов, сумма которых кратна 12.
  • Выводим ответ, который записан в count.

Задание А. Язык программирования PascalABC. var N, i, j: integer;  count: longint;  a: array[1..10000] of integer; begin  readln(N);  for i:=1 to N do  readln(a[i]);  count := 0; // инициализация  for i:=1 to N-1 do  for j:=i+1 to N do  if (a[i] + a[j]) mod 12 = 0 then  count := count + 1;  writeln(count); end.

Задание А. Язык программирования PascalABC.

var N, i, j: integer;

count: longint;

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

begin

readln(N);

for i:=1 to N do

readln(a[i]);

count := 0; // инициализация

for i:=1 to N-1 do

for j:=i+1 to N do

if (a[i] + a[j]) mod 12 = 0 then

count := count + 1;

writeln(count);

end.

Задание Б. Алгоритм решения. Если сумма двух чисел делится на 12, то сумма остатков от деления этих чисел на 12 также делится на 12, то есть равна 0 либо 12. Поэтому заводим массив счётчиков чисел с одинаковыми остатками от деления на 12 ( rem[0..11] )  и при вводе очередного числа увеличиваем счётчик, соответствующий полученному остатку от деления на 12. Если число делится на 12 (остаток 0), то оно образует пару со всеми числами, которые делятся на 12, кроме самого себя, таких сочетаний rem[0]*(rem[0]-1) , но при этом каждая пара подсчитана дважды, то есть это произведение нужно разделить на 2. Аналогичная ситуация с теми числами, которые делятся на 6, количество соответствующих пар находим как  rem[6]*(rem[6]-1) div 2 . Количество остальных подходящих пар считаются по формуле rem[i]*rem[12-i]. Чтобы не получить дублирование пар, будем в цикле перебирать только остатки, меньшие 6.

Задание Б. Алгоритм решения.

  • Если сумма двух чисел делится на 12, то сумма остатков от деления этих чисел на 12 также делится на 12, то есть равна 0 либо 12. Поэтому заводим массив счётчиков чисел с одинаковыми остатками от деления на 12 ( rem[0..11] ) и при вводе очередного числа увеличиваем счётчик, соответствующий полученному остатку от деления на 12.
  • Если число делится на 12 (остаток 0), то оно образует пару со всеми числами, которые делятся на 12, кроме самого себя, таких сочетаний rem[0]*(rem[0]-1) , но при этом каждая пара подсчитана дважды, то есть это произведение нужно разделить на 2. Аналогичная ситуация с теми числами, которые делятся на 6, количество соответствующих пар находим как rem[6]*(rem[6]-1) div 2 .
  • Количество остальных подходящих пар считаются по формуле rem[i]*rem[12-i]. Чтобы не получить дублирование пар, будем в цикле перебирать только остатки, меньшие 6.

Задание Б. Язык программирования PascalABC . var rem: array[0..11] of integer;  N, i, x, count: longint; begin  for i:=0 to 11 do rem[i]:= 0;  readln(N);  for i := 1 to N do begin   readln(x);   inc(rem[x mod 12])  end; count := (rem[0]*(rem[0]-1)+rem[6]*(rem[6]-1))div 2; for i:=1 to 5 do  count := count + rem[i]*rem[12-i]; writeln(count) end.

Задание Б. Язык программирования PascalABC .

var rem: array[0..11] of integer;

N, i, x, count: longint;

begin

for i:=0 to 11 do rem[i]:= 0;

readln(N);

for i := 1 to N do begin

readln(x);

inc(rem[x mod 12])

end;

count := (rem[0]*(rem[0]-1)+rem[6]*(rem[6]-1))div 2;

for i:=1 to 5 do

count := count + rem[i]*rem[12-i];

writeln(count)

end.

Задача 6. (ИНФ_ДЕМО 2015) На спутнике «Фотон» установлен прибор, предназначенный для измерения энергии космических лучей. Каждую минуту прибор передаёт по каналу связи неотрицательное вещественное число – количество энергии, полученной за последнюю минуту, измеренное в условных единицах. Временем, в течение которого происходит передача, можно пренебречь. Необходимо найти в заданной серии показаний прибора минимальное произведение двух показаний, между моментами передачи которых прошло не менее 6 минут . Количество энергии, получаемое прибором за минуту, не превышает 1000 условных единиц. Общее количество показаний прибора в серии не превышает 10 000. Демо 2016

Задача 6. (ИНФ_ДЕМО 2015)

На спутнике «Фотон» установлен прибор, предназначенный для измерения энергии космических лучей. Каждую минуту прибор передаёт по каналу связи неотрицательное вещественное число – количество энергии, полученной за последнюю минуту, измеренное в условных единицах. Временем, в течение которого происходит передача, можно пренебречь. Необходимо найти в заданной серии показаний прибора минимальное произведение двух показаний, между моментами передачи которых прошло не менее 6 минут . Количество энергии, получаемое прибором за минуту, не превышает 1000 условных единиц. Общее количество показаний прибора в серии не превышает 10 000.

Демо 2016

6. В каждой из следующих N строк задаётся одно неотрицательное вещественное число – очередное показание прибора. Пример входных данных: Программа должна вывести одно число – описанное в условии произведение. 11 Пример выходных данных для приведённого примера входных данных: 12 45.3 48 5.5 4 25 23 21 20 10 12 26 Демо 2016 » width=»640″

Задача 6. Продолжение.

Входные данные представлены следующим образом. В первой строке задаётся число N – общее количество показаний прибора. Гарантируется, что N 6. В каждой из следующих N строк задаётся одно неотрицательное вещественное число – очередное показание прибора.

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

Программа должна вывести одно число – описанное в условии произведение.

11

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

12

45.3

48

5.5

4

25

23

21

20

10

12

26

Демо 2016

Задание A. Алгоритм решения . Сохраняем все исходные данные в массив А. Заведём переменную m для поиска минимального значения произведения и присвоим ей начальное значение 1000*1000+1. В цикле перебираем все возможные пары значений и, если между моментами передачи показаний прошло не менее 6 минут и их произведение меньше чем m, записываем это произведение в m. Выводим ответ, который записан в m.

Задание A. Алгоритм решения .

  • Сохраняем все исходные данные в массив А.
  • Заведём переменную m для поиска минимального значения произведения и присвоим ей начальное значение 1000*1000+1.
  • В цикле перебираем все возможные пары значений и, если между моментами передачи показаний прошло не менее 6 минут и их произведение меньше чем m, записываем это произведение в m.
  • Выводим ответ, который записан в m.

=6) and (a[i]*a[j] then m := a[i]*a[j]; writeln(m); end. » width=»640″

Задание А. Язык программирования PascalABC.

var N, i, j: integer;

m: real;

a: array[1..10000] of real;

Begin

// ввод данных

readln(N);

for i:=1 to N do readln(a[i]);

// поиск минимального произведения двух показаний, между моментами передачи которых прошло не менее 6 минут

m:= 1000*1000+1;

for i:=1 to N-1 do

for j:=i+1 to N do

if (j-i=6) and (a[i]*a[j] then

m := a[i]*a[j];

writeln(m);

end.


Задание А. Способ 2. Const s = 6 ; var N, i, j: integer;  m: real;  a: array[1..10000] of real; Begin // ввод данных  readln(N);  for i:=1 to N do readln(a[i]); // поиск минимального произведения двух показаний, между моментами передачи которых прошло не менее 6 минут  m:= 1000*1000+1;  for i:=1 to N-s do  for j:= i+s to N do  if (a[i]*a[j]  m := a[i]*a[j];  writeln(m); end.

Задание А. Способ 2.

Const s = 6 ;

var N, i, j: integer;

m: real;

a: array[1..10000] of real;

Begin

// ввод данных

readln(N);

for i:=1 to N do readln(a[i]);

// поиск минимального произведения двух показаний, между моментами передачи которых прошло не менее 6 минут

m:= 1000*1000+1;

for i:=1 to N-s do

for j:= i+s to N do

if (a[i]*a[j]

m := a[i]*a[j];

writeln(m);

end.

6), минимальное значение от начала данных до элемента (i-6) включительно (переменная mn). Затем нужно умножать каждый элемент, начиная с седьмого, на значение этого минимума и выбрать наименьшее из этих произведений (переменная m). » width=»640″

Задание Б. Способ 1 на 3 балла. Алгоритм решения .

  • Чтобы произведение было минимальным надо текущее значение умножать на минимальное из всех предшествующих, отстоящих от текущего на 6 и более показаний и выбирать из этих произведений минимальное.
  • Сохраняем все исходные данные в массив А.
  • Для построения программы, эффективной по времени , нужно определить для каждого элемента входных данных, начиная с седьмого (i, i 6), минимальное значение от начала данных до элемента (i-6) включительно (переменная mn). Затем нужно умножать каждый элемент, начиная с седьмого, на значение этого минимума и выбрать наименьшее из этих произведений (переменная m).

Задание Б. Язык программирования PascalABC . const s = 6; {требуемое расстояние между показаниями} var N, i : integer; a: array[1..10000] of real; mn: real ; {минимальное введенное число без s последних} m: real; {минимальное значение произведения} begin  readln(N);  for i:=1 to N do readln(a[i]);  mn := 1000 + 1;  m := 1000 * 1000 + 1;  for i := s + 1 to N do begin   if a[i-s]   if a[i] * mn   end;  writeln(m); end.

Задание Б. Язык программирования PascalABC .

const s = 6; {требуемое расстояние между показаниями}

var

N, i : integer;

a: array[1..10000] of real;

mn: real ; {минимальное введенное число без s последних}

m: real; {минимальное значение произведения}

begin

readln(N);

for i:=1 to N do readln(a[i]);

mn := 1000 + 1;

m := 1000 * 1000 + 1;

for i := s + 1 to N do begin

if a[i-s]

if a[i] * mn

end;

writeln(m); end.

Задание Б. Способ 2 на 4 балла. Алгоритм решения. Чтобы произведение было минимальным надо текущее значение умножать на минимальное из всех предшествующих, отстоящих от текущего на 6 и более показаний и выбирать из этих произведений минимальное. Каждое текущее показание используется после ввода ещё 6 элементов и после этого становится ненужным, поэтому достаточно хранить 6 последних показаний в массиве A. В цикле считываем показания прибора, сохраняя 6 последних в массиве А. Перед поступлением очередного показания (х) готовим для него минимум, т.е. проверяем, не будет ли А[1] меньше записанного минимума (mn) и если это так, то обновляем mn. Читаем очередное показание и проверяем произведение x*mn.  Если оно меньше минимального сохранённого в m, то обновляем m. Сдвигаем элементы вспомогательного массива влево и последним записываем текущее показание. После цикла минимальное произведение будет записано в переменной m, её и печатаем.

Задание Б. Способ 2 на 4 балла. Алгоритм решения.

  • Чтобы произведение было минимальным надо текущее значение умножать на минимальное из всех предшествующих, отстоящих от текущего на 6 и более показаний и выбирать из этих произведений минимальное. Каждое текущее показание используется после ввода ещё 6 элементов и после этого становится ненужным, поэтому достаточно хранить 6 последних показаний в массиве A.
  • В цикле считываем показания прибора, сохраняя 6 последних в массиве А.
  • Перед поступлением очередного показания (х) готовим для него минимум, т.е. проверяем, не будет ли А[1] меньше записанного минимума (mn) и если это так, то обновляем mn.
  • Читаем очередное показание и проверяем произведение x*mn. Если оно меньше минимального сохранённого в m, то обновляем m.
  • Сдвигаем элементы вспомогательного массива влево и последним записываем текущее показание.
  • После цикла минимальное произведение будет записано в переменной m, её и печатаем.

Задание Б. Язык программирования PascalABC . const s = 6; //требуемое расстояние между показаниями var N, i, j : integer; a: array[1..s] of real; //хранение s показаний прибора mn: real; // минимальное введенное число без s последних m: real; //минимальное значение произведения x: real; //очередное показание прибора begin  readln(N); //количество показаний  //Ввод первых s чисел  for i:=1 to s do    readln(a[i]);

Задание Б. Язык программирования PascalABC .

const s = 6; //требуемое расстояние между показаниями

var

N, i, j : integer;

a: array[1..s] of real; //хранение s показаний прибора

mn: real; // минимальное введенное число без s последних

m: real; //минимальное значение произведения

x: real; //очередное показание прибора

begin

readln(N); //количество показаний

//Ввод первых s чисел

for i:=1 to s do

readln(a[i]);

Задание Б. Способ 2 . Продолжение. { Ввод остальных значений, поиск минимального произведения} mn := 1001; // минимальное введенное число без s последних  m := 1000 * 1000+1; // минимальное значение произведения for i := s + 1 to N do begin  if a[1]  readln(x);  if x * mn  // сдвигаем элементы вспомогательного массива влево  for j := 1 to s - 1 do  a[j] := a[j + 1];  a[s] := x; end; writeln(m); End.

Задание Б. Способ 2 . Продолжение.

{ Ввод остальных значений, поиск минимального произведения}

mn := 1001; // минимальное введенное число без s последних

m := 1000 * 1000+1; // минимальное значение произведения

for i := s + 1 to N do begin

if a[1]

readln(x);

if x * mn

// сдвигаем элементы вспомогательного массива влево

for j := 1 to s — 1 do

a[j] := a[j + 1];

a[s] := x;

end;

writeln(m);

End.

Задание Б. Способ 3 на 4 балла. Алгоритм решения. Чтобы произведение было минимальным надо текущее значение умножать на минимальное из всех предшествующих, отстоящих от текущего на 6 и более показаний и выбирать из этих произведений минимальное. Каждое текущее минимальное показание используется после ввода ещё 6 элементов и после этого становится ненужным, поэтому достаточно хранить 6 последних минимумов. Для этого заведём массив armin[0..5] В каждом элементе массива будет хранится минимум подходящий для показаний, номер которых в потоке ввода равен номеру элемента массива armin по модулю 6. При поступлении очередного показания проверяем, не будет ли произведение текущего показания и записанного минимума наименьшим произведением и если это так, то обновляем Pmin Обновляем минимум (создаём минимум для показания с номером = текущий +6): берётся меньшее значение из текущего и записанного в массиве armin на предыдущем шаге.

Задание Б. Способ 3 на 4 балла. Алгоритм решения.

  • Чтобы произведение было минимальным надо текущее значение умножать на минимальное из всех предшествующих, отстоящих от текущего на 6 и более показаний и выбирать из этих произведений минимальное.
  • Каждое текущее минимальное показание используется после ввода ещё 6 элементов и после этого становится ненужным, поэтому достаточно хранить 6 последних минимумов. Для этого заведём массив armin[0..5]
  • В каждом элементе массива будет хранится минимум подходящий для показаний, номер которых в потоке ввода равен номеру элемента массива armin по модулю 6.
  • При поступлении очередного показания проверяем, не будет ли произведение текущего показания и записанного минимума наименьшим произведением и если это так, то обновляем Pmin
  • Обновляем минимум (создаём минимум для показания с номером = текущий +6): берётся меньшее значение из текущего и записанного в массиве armin на предыдущем шаге.

Задание Б. Язык программирования PascalABC.net . Const s = 6; var armin: array[0..s-1] of real;  N, i : longint; a, Pmin : real; Begin Readln(N);  //вводим первые s показаний и фиксируем минимумы Readln(armin[1]); for i:=2 to s do begin  readln(a);  armin[i mod s] := min(a, armin[i-1]);  end; Pmin := 1000*1000+1; // ищем минимальное произведение for i := s+1 to N do begin  readln(a);  Pmin := min(Pmin, a*armin[i mod s]);  armin[i mod s] := min(a, armin[(i-1) mod s])  end; writeln(Pmin); end.

Задание Б. Язык программирования PascalABC.net .

Const s = 6;

var armin: array[0..s-1] of real;

N, i : longint; a, Pmin : real;

Begin Readln(N);

//вводим первые s показаний и фиксируем минимумы

Readln(armin[1]);

for i:=2 to s do begin

readln(a);

armin[i mod s] := min(a, armin[i-1]);

end;

Pmin := 1000*1000+1; // ищем минимальное произведение

for i := s+1 to N do begin

readln(a);

Pmin := min(Pmin, a*armin[i mod s]);

armin[i mod s] := min(a, armin[(i-1) mod s])

end;

writeln(Pmin); end.

Задача 7. (ИНФ_ДЕМО 2016) В физической лаборатории проводится долговременный эксперимент по изучению гравитационного поля Земли.  По каналу связи каждую минуту в лабораторию передаётся положительное целое число – текущее показание прибора «Сигма 2015». Количество передаваемых чисел в серии  известно и может быть очень велико (не превышает 10 000).  Все числа не превышают 1000. Временем, в течение которого происходит передача, можно пренебречь.  Необходимо вычислить «бета-значение» серии показаний прибора – минимальное  чётное произведение двух показаний, между моментами передачи которых прошло не менее 6 минут. Если получить такое произведение не удаётся, ответ считается равным –1. Демо 2016

Задача 7. (ИНФ_ДЕМО 2016)

В физической лаборатории проводится долговременный эксперимент по изучению гравитационного поля Земли. По каналу связи каждую минуту в лабораторию передаётся положительное целое число – текущее показание прибора «Сигма 2015». Количество передаваемых чисел в серии известно и может быть очень велико (не превышает 10 000). Все числа не превышают 1000. Временем, в течение которого происходит передача, можно пренебречь. Необходимо вычислить «бета-значение» серии показаний прибора – минимальное чётное произведение двух показаний, между моментами передачи которых прошло не менее 6 минут. Если получить такое произведение не удаётся, ответ считается равным –1.

Демо 2016

6. В каждой из следующих N строк задаётся одно положительное целое число – очередное показание прибора. Пример входных данных: 11 12 45 5 3 17 23 21 20 19 18 17 Программа должна вывести одно число – описанное в условии произведение либо –1, если получить такое произведение не удаётся. Выходные данные для приведённого выше примера входных данных: 54 » width=»640″

Входные данные представлены следующим образом. В первой строке задаётся число N – общее количество показаний прибора. Гарантируется, что N 6. В каждой из следующих N строк задаётся одно положительное целое число – очередное показание прибора.

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

11

12

45

5

3

17

23

21

20

19

18

17

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

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

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

Подсказка № 1.

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

Подсказка № 2. Для каждого показания с номером k, начиная с k = 7, рассмотрите все допустимые по условиям задачи пары,  в которых данное показание получено вторым. Минимальное произведение из всех этих пар будет получено, если первым в паре будет взято минимальное подходящее показание среди всех, полученных от начала приёма и до показания с номером k – 6. Если очередное показание чётное, минимальное среди предыдущих может быть любым, если нечётное – только чётным .

Подсказка № 2.

Для каждого показания с номером k, начиная с k = 7, рассмотрите все допустимые по условиям задачи пары, в которых данное показание получено вторым.

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

Задание Б. Язык программирования PascalABC. const amax = 1001 ; {больше максимально возможного показания} var N: integer; a: array[1..6] of integer ; {хранение 6 показаний прибора} x: integer ; {ввод очередного показания} ma: integer ; {минимальное число без 6 последних} me: integer ; {минимальное чётное число без 6 последних} mp: integer ; {минимальное значение произведения} p: integer; i, j: integer; begin readln(N); {Ввод первых 6 чисел} for i:=1 to 6 do readln(a[i]); {Ввод остальных значений, поиск минимального произведения} ma := amax; me := amax; mp :=amax*amax;

Задание Б. Язык программирования PascalABC.

const amax = 1001 ; {больше максимально возможного показания}

var N: integer;

a: array[1..6] of integer ; {хранение 6 показаний прибора}

x: integer ; {ввод очередного показания}

ma: integer ; {минимальное число без 6 последних}

me: integer ; {минимальное чётное число без 6 последних}

mp: integer ; {минимальное значение произведения}

p: integer; i, j: integer;

begin

readln(N);

{Ввод первых 6 чисел}

for i:=1 to 6 do readln(a[i]);

{Ввод остальных значений, поиск минимального произведения}

ma := amax;

me := amax;

mp :=amax*amax;

for i := 7 to N do begin  readln(x);  if a[1]  if (a[1] mod 2 = 0) and (a[1]  if x mod 2 = 0 then p := x * ma  else p := x * me;  if (p  {сдвигаем элементы вспомогательного массива влево}  for j := 1 to 5 do a[j] := a[j + 1];  a[6] := x;  end; if mp = amax*amax then mp:=-1; writeln(mp); end.

for i := 7 to N do begin

readln(x);

if a[1]

if (a[1] mod 2 = 0) and (a[1]

if x mod 2 = 0 then p := x * ma

else p := x * me;

if (p

{сдвигаем элементы вспомогательного массива влево}

for j := 1 to 5 do a[j] := a[j + 1];

a[6] := x;

end;

if mp = amax*amax then mp:=-1;

writeln(mp);

end.

Задача 8. (ИНФ_ДЕМО 2019) На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4 (разница в индексах элементов пары должна быть 4 или более, порядок элементов в паре неважен). Необходимо определить количество таких пар, для которых произведение элементов делится на 29. Описание входных и выходных данных В первой строке входных данных задаётся количество чисел N  (4 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000. В качестве результата программа должна вывести одно число: количество пар элементов, находящихся в последовательности на расстоянии не меньше чем 4, в которых произведение элементов кратно 29. Демо 2016

Задача 8. (ИНФ_ДЕМО 2019)

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

Описание входных и выходных данных

В первой строке входных данных задаётся количество чисел N (4 ≤ N ≤ 1000).

В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.

В качестве результата программа должна вывести одно число: количество пар элементов, находящихся в последовательности на расстоянии не меньше чем 4, в которых произведение элементов кратно 29.

Демо 2016

Задача 8. Продолжение. Пример входных данных: 7 58 2 3 5 4 1 29 Пример выходных данных для приведённого выше примера входных данных: 5 Пояснение. Из 7 заданных элементов с учётом допустимых расстояний между ними можно составить 6 произведений:  58·4, 58·1, 58·29, 2·1, 2·29, 3·29.  Из них на 29 делятся 5 произведений. Демо 2016

Задача 8. Продолжение.

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

7

58

2

3

5

4

1

29

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

Пояснение. Из 7 заданных элементов с учётом допустимых расстояний между ними можно составить 6 произведений: 58·4, 58·1, 58·29, 2·1, 2·29, 3·29. Из них на 29 делятся 5 произведений.

Демо 2016

Задание A. Алгоритм решения. Сохраняем все исходные данные в массив А. Для подсчёта количества пар в которых произведение кратно 29 заводим переменную count и присваиваем ей начальное значение 0. В цикле перебираем все возможные пары и, если разница в индексах элементов пары 4 или более и их произведение кратно 29, увеличиваем count на 1. Выводим ответ, который подсчитан в count .

Задание A. Алгоритм решения.

  • Сохраняем все исходные данные в массив А.
  • Для подсчёта количества пар в которых произведение кратно 29 заводим переменную count и присваиваем ей начальное значение 0.
  • В цикле перебираем все возможные пары и, если разница в индексах элементов пары 4 или более и их произведение кратно 29, увеличиваем count на 1.
  • Выводим ответ, который подсчитан в count .

= 4) and (a[i]*a[j] mod 29 = 0) then count := count + 1; writeln(count); end. » width=»640″

Задание А. Язык программирования PascalABC.

var N, i, j, count : integer;

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

begin

readln(N);

for i:=1 to N do

readln(a[i]);

count := 0;

for i:=1 to N-1 do

for j:=i+1 to N do

if (j-i = 4) and (a[i]*a[j] mod 29 = 0) then

count := count + 1;

writeln(count);

end.

Задание Б. Алгоритм решения . Произведение двух чисел делится на 29, если хотя бы один из сомножителей делится на 29. При вводе чисел можно подсчитывать количество чисел, кратных 29, не считая четырёх последних. Обозначим их n29. Очередное считанное число будем рассматривать как возможный правый элемент искомой пары. Если очередное считанное число делится на 29, то к ответу следует прибавить количество чисел до него, не считая четырёх последних. Если очередное считанное число на 29 не делится, то к ответу следует прибавить n29. Поскольку при обработке очередного элемента входных данных используются значения, находящиеся на четыре элемента ранее, достаточно хранить только четыре последних элемента.

Задание Б. Алгоритм решения .

  • Произведение двух чисел делится на 29, если хотя бы один из сомножителей делится на 29.
  • При вводе чисел можно подсчитывать количество чисел, кратных 29, не считая четырёх последних. Обозначим их n29.
  • Очередное считанное число будем рассматривать как возможный правый элемент искомой пары.
  • Если очередное считанное число делится на 29, то к ответу следует прибавить количество чисел до него, не считая четырёх последних. Если очередное считанное число на 29 не делится, то к ответу следует прибавить n29.
  • Поскольку при обработке очередного элемента входных данных используются значения, находящиеся на четыре элемента ранее, достаточно хранить только четыре последних элемента.

Задание Б. Язык программирования PascalABC . const s = 4; {требуемое расстояние между элементами} var N, i, j : integer; x: integer; {очередное значение} {хранение последних s значений} a: array[1..s] of integer;  {количество делящихся на 29 элементов,  не считая s последних}  n29: integer ; {количество искомых пар} cnt: integer; begin  readln(N);  {Ввод первых s чисел}  for i:=1 to s do readln(a[i]);

Задание Б. Язык программирования PascalABC .

const s = 4; {требуемое расстояние между элементами}

var

N, i, j : integer;

x: integer; {очередное значение}

{хранение последних s значений}

a: array[1..s] of integer;

{количество делящихся на 29 элементов,

не считая s последних}

n29: integer ;

{количество искомых пар}

cnt: integer;

begin

readln(N);

{Ввод первых s чисел}

for i:=1 to s do readln(a[i]);

{Ввод остальных значений, подсчет искомых пар} cnt := 0; n29 := 0; for i := s + 1 to n do begin  if a[1] mod 29 = 0 then  n29 := n29 + 1;  readln(x);  if x mod 29 = 0 then  cnt := cnt + i - s  else  cnt := cnt + n29;  {сдвигаем элементы вспомогательного массива влево}  for j := 1 to s - 1 do  a[j] := a[j + 1];  {записываем текущий элемент в конец массива}  a[s] := x end; writeln(cnt) end.

{Ввод остальных значений, подсчет искомых пар}

cnt := 0;

n29 := 0;

for i := s + 1 to n do begin

if a[1] mod 29 = 0 then

n29 := n29 + 1;

readln(x);

if x mod 29 = 0 then

cnt := cnt + i — s

else

cnt := cnt + n29;

{сдвигаем элементы вспомогательного массива влево}

for j := 1 to s — 1 do

a[j] := a[j + 1];

{записываем текущий элемент в конец массива}

a[s] := x

end;

writeln(cnt)

end.

Задача 9. (принесли дети в мае 2018 года) На спутнике «Восход» установлен прибор, предназначенный для измерения солнечной активности. Каждую минуту прибор передаёт по каналу связи натуральное число – количество энергии солнечного излучения, полученной за последнюю минуту, измеренное в условных единицах. Временем, в течение которого происходит передача, можно пренебречь. Необходимо найти в заданной серии количество пар таких показаний прибора, произведение которых кратно 6 и между моментами передачи которых прошло не менее 3 минут . Количество энергии, получаемое прибором за минуту, не превышает 1000 условных единиц. Общее количество показаний прибора в серии не превышает 10 000. Задача А (2 балла).  Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Задача Б (4 балла).  Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Задача 9. (принесли дети в мае 2018 года)

На спутнике «Восход» установлен прибор, предназначенный для измерения солнечной активности. Каждую минуту прибор передаёт по каналу связи натуральное число – количество энергии солнечного излучения, полученной за последнюю минуту, измеренное в условных единицах. Временем, в течение которого происходит передача, можно пренебречь. Необходимо найти в заданной серии количество пар таких показаний прибора, произведение которых кратно 6 и между моментами передачи которых прошло не менее 3 минут . Количество энергии, получаемое прибором за минуту, не превышает 1000 условных единиц. Общее количество показаний прибора в серии не превышает 10 000.

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

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

3. В каждой из следующих  N  строк задаётся одно натуральное число – очередное показание прибора. Пример входных данных: 5 6 2 4 1 3 Пример выходных данных для приведённого выше примера входных данных: 3 В приведённом наборе из 5 чисел имеются три пары (6, 3), (2, 3) и (6, 1), удовлетворяющих усло вию задачи. » width=»640″

Задача 9. Продолжение.

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

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

5

6

2

4

1

3

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

3

В приведённом наборе из 5 чисел имеются три пары (6, 3), (2, 3) и (6, 1), удовлетворяющих усло вию задачи.

Задание A. Алгоритм решения. Сохраняем все исходные данные в массив А. Для подсчёта количества пар в которых произведение кратно 6 заводим переменную count и присваиваем ей начальное значение 0. В цикле перебираем все возможные пары и, если разница в индексах элементов пары 3 или более и их произведение кратно 6, увеличиваем count на 1. Выводим ответ, который подсчитан в count .

Задание A. Алгоритм решения.

  • Сохраняем все исходные данные в массив А.
  • Для подсчёта количества пар в которых произведение кратно 6 заводим переменную count и присваиваем ей начальное значение 0.
  • В цикле перебираем все возможные пары и, если разница в индексах элементов пары 3 или более и их произведение кратно 6, увеличиваем count на 1.
  • Выводим ответ, который подсчитан в count .

= 3) and (a[i]*a[j] mod 6 = 0) then count := count + 1; writeln(count); end. » width=»640″

Задание А. Язык программирования PascalABC.

var N, i, j, count : integer;

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

begin

readln(N);

for i:=1 to N do

readln(a[i]);

count := 0;

for i:=1 to N-1 do

for j:=i+1 to N do

if (j-i = 3) and (a[i]*a[j] mod 6 = 0) then

count := count + 1;

writeln(count);

end.

Задание Б. Алгоритм решения . При вводе чисел можно подсчитывать количество чисел, не считая трёх последних, кратных 6, кратных 3, кратных 2 и не кратных 2, 3, 6. Обозначим их n6, n3, n2 и n1 соответственно. Очередное считанное число будем рассматривать как возможный правый элемент искомой пары. Для него корректируем счётчики n6, n3, n2 и n1 с учётом нового значения из очереди. Если очередное считанное число кратно 6, то оно образует пары со всеми числами; кратно 2, но не 3, то оно образует пары с числами, кратными 3; кратно 3, но не 2, то оно образует пары с числами, кратными 2; не кратно 2 и не кратно 3, образует пары с числами, кратными 6. Добавляем нужное количество в счётчик подходящих пар  k. После обработки всех значений выводим k.

Задание Б. Алгоритм решения .

  • При вводе чисел можно подсчитывать количество чисел, не считая трёх последних, кратных 6, кратных 3, кратных 2 и не кратных 2, 3, 6. Обозначим их n6, n3, n2 и n1 соответственно.
  • Очередное считанное число будем рассматривать как возможный правый элемент искомой пары.
  • Для него корректируем счётчики n6, n3, n2 и n1 с учётом нового значения из очереди.
  • Если очередное считанное число
  • кратно 6, то оно образует пары со всеми числами;
  • кратно 2, но не 3, то оно образует пары с числами, кратными 3;
  • кратно 3, но не 2, то оно образует пары с числами, кратными 2;
  • не кратно 2 и не кратно 3, образует пары с числами, кратными 6.
  • Добавляем нужное количество в счётчик подходящих пар  k.
  • После обработки всех значений выводим k.

Задание Б. Язык программирования PascalABC . const s = 3; {требуемое расстояние между элементами} var N, i, j : integer; x : integer; {очередное значение} {хранение последних s значений} a : array[0..s-1] of integer;  {количество чисел, кратных 6, кратных 3, кратных 2  и не кратных 2, 3, 6, не считая s последних}  n6, n3, n2, n1 : integer ; k : integer; {количество искомых пар} begin  readln(N);  {Ввод первых s чисел}  for i:=0 to s-1 do readln(a[i]);

Задание Б. Язык программирования PascalABC .

const s = 3; {требуемое расстояние между элементами}

var

N, i, j : integer;

x : integer; {очередное значение}

{хранение последних s значений}

a : array[0..s-1] of integer;

{количество чисел, кратных 6, кратных 3, кратных 2 и не кратных 2, 3, 6, не считая s последних}

n6, n3, n2, n1 : integer ;

k : integer; {количество искомых пар}

begin

readln(N);

{Ввод первых s чисел}

for i:=0 to s-1 do readln(a[i]);

{Ввод остальных значений, подсчет искомых пар}  uk := 0;  k := 0; n1 := 0; n2 := 0; n3 := 0; n6 := 0; for i := s to n - 1 do begin  {обновляем счётчики}  if a[uk] mod 6 = 0 then n6 := n6 + 1  else if a[uk] mod 3 = 0 then n3 := n3 + 1  else if a[uk] mod 2 = 0 then n2 := n2 + 1  else n1 := n1 + 1;  {считываем очередное значение и обновляем k}  readln(x);  if x mod 6 = 0 then k := k + n1 + n2 + n3 + n6  else if x mod 3 = 0 then k := k + n2 + n6  else if x mod 2 = 0 then k := k + n3 + n6  else k := k + n6;  {записываем х в очередь и сдвигаем указатель}  A[uk] := x;  uk := (uk + 1) mod 3; end ; writeln(k)  end.

{Ввод остальных значений, подсчет искомых пар}

uk := 0;

k := 0; n1 := 0; n2 := 0; n3 := 0; n6 := 0;

for i := s to n — 1 do begin

{обновляем счётчики}

if a[uk] mod 6 = 0 then n6 := n6 + 1

else if a[uk] mod 3 = 0 then n3 := n3 + 1

else if a[uk] mod 2 = 0 then n2 := n2 + 1

else n1 := n1 + 1;

{считываем очередное значение и обновляем k}

readln(x);

if x mod 6 = 0 then k := k + n1 + n2 + n3 + n6

else if x mod 3 = 0 then k := k + n2 + n6

else if x mod 2 = 0 then k := k + n3 + n6

else k := k + n6;

{записываем х в очередь и сдвигаем указатель}

A[uk] := x;

uk := (uk + 1) mod 3;

end ;

writeln(k) end.

Спасибо за внимание!

Спасибо за внимание!

Вариации на тему Задачи 1

Вариации на тему Задачи 1

Имеется набор данных, состоящий из троек натуральных чисел. Необходимо выбрать из каждой тройки одно число так, чтобы сумма всех выбранных чисел была не кратна 4 и при этом была максимально  возможной . Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0. Входные данные: На вход программе в первой строке подаётся количество троек N (1   N   100000).  Каждая из следующих  N строк содержит три  натуральных числа,  не превышающих 10 000. Пример 1 6 Пример 2 Пример 3 8 3 4 Ответ : 61 6 4 8 12 6 Ответ : 57 8 3 4 9 5 6 1 3 2 4 8 11 Ответ : 63 2 8 3 5 12 12 9 5 6 2 8 3 6 8 12 12 3 5 5 4 12 1 4 12 12 3 5 1 4 12 3 3 12 1 1 13 Взята у К.Ю. Полякова, задача № 73, автор Д.Ф. Муфаззалов. Для задания А (переборный вариант) оставляем 6 троек значений.

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

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

Пример 1

6

Пример 2

Пример 3

8 3 4

Ответ : 61

6

4 8 12

6

Ответ : 57

8 3 4

9 5 6

1 3 2

4 8 11

Ответ : 63

2 8 3

5 12 12

9 5 6

2 8 3

6 8 12

12 3 5

5 4 12

1 4 12

12 3 5

1 4 12

3 3 12

1 1 13

Взята у К.Ю. Полякова, задача № 73, автор Д.Ф. Муфаззалов. Для задания А (переборный вариант) оставляем 6 троек значений.

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

Задание A. Алгоритм решения.

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

sMax) then sMax := s ; end; writeln(sMax); end. » width=»640″

Задание А. Полный перебор.

var a: array[1..6, 1..3] of longint; s, sMax, i1, i2, i3, i4, i5, i6: longint;

Begin

for i1 := 1 to 6 do

readln(a[i1,1], a[i1,2], a[i1,3]);

sMax := 0 ;

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

for i6:=1 to 3 do begin

s:=a[1,i1]+a[2,i2]+a[3,i3]+a[4,i4]+a[5,i5]+a[6,i6];

if (s mod 3 0) and (s sMax) then sMax := s ; end;

writeln(sMax);

end.

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

Задание Б. Алгоритм решения.

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

Будем выбирать из каждой тройки наибольшее значение и найдем их сумму. Вместе с этим по всем тройкам будем искать наименьшую некратную 4 разницу между этим наибольшим значением и каждым из оставшихся чисел в тройке (*).

Если полученная сумма некратна 4, она и есть ответ. Если полученная сумма кратна 4, то если существует разница (*), вычтем ее из суммы, и это будет ответ, иначе выведем 0.

y) then min4:=y else min4:=x else if (x mod 4 = 0) and (y mod 4 = 0) then min4:= aMax + 1 else if (x mod 4 0) then min4:=x else min4:=y; end; » width=»640″

Задание Б. Язык программирования PascalABC .

сonst aMax = 10000; //наибольшее возможное число в исходных данных

Var N, i : longint; //количество пар, переменная цикла

a, b, с : longint; //тройка чисел

S : longint; //сумма выбранных чисел

d : longint; //минимум в паре разностей с максимальным, не кратный 4

d_min : longint; //минимальная разница не кратная 4

function min4 (x, y : longint) : longint; // возвращает // наименьшее некратное 4 значение из х и у, если такого нет, то aMax + 1

begin

If (x mod 4 0) and (y mod 4 0) then

if (x y) then min4:=y else min4:=x

else if (x mod 4 = 0) and (y mod 4 = 0) then

min4:= aMax + 1

else if (x mod 4 0) then min4:=x else min4:=y;

end;

= b) and (a = c) then // a — максимум begin s := s + a; d := min4(a-b, a-c) end else if (b = a) and (b = c) then // b — максимум begin s := s + b; d := min4(b-a, b-c) end else // c — максимум begin s := s + c; d := min4(c-a, c-b) end; if d end; If (s mod 4 = 0) then If (d_min aMax) then s:= 0 else s:= s – d_min; writeln(s); end. » width=»640″

begin

s := 0;

d_min := aMax + 1;

readln(N);

for i := 1 to N do begin

readln(a, b, c);

if (a = b) and (a = c) then // a — максимум

begin s := s + a; d := min4(a-b, a-c) end

else if (b = a) and (b = c) then // b — максимум

begin s := s + b; d := min4(b-a, b-c) end

else // c — максимум

begin s := s + c; d := min4(c-a, c-b) end;

if d

end;

If (s mod 4 = 0) then

If (d_min aMax) then s:= 0 else s:= s – d_min;

writeln(s);

end.

Что изменится в алгоритме,  если надо найти  максимальную сумму, кратную 4? Надо найти три минимальные разности,  которые при делении на 4 дают остатки 1, 2, 3.  Тогда ответом будет : сумма S если она кратна 4,  или S – разность, соответствующая (S mod 4),  если такая существует, или 0. Взята у К.Ю. Полякова, задача № 74, автор Д.Ф. Муфаззалов

Что изменится в алгоритме, если надо найти максимальную сумму, кратную 4?

Надо найти три минимальные разности, которые при делении на 4 дают остатки 1, 2, 3. Тогда ответом будет :

сумма S если она кратна 4, или S – разность, соответствующая (S mod 4), если такая существует,

или 0.

Взята у К.Ю. Полякова, задача № 74, автор Д.Ф. Муфаззалов

Что изменится в программе,  если надо найти  максимальную сумму, кратную 4? Для хранения минимальных разностей, которые при делении на 4 дают остатки 1, 2, 3 заведём глобальный массив d_min из трёх элементов с индексами 1, 2, 3, соответствующими остаткам от деления на 4. Тогда ответом будет сумма S если она кратна 4, или S – разность, соответствующая (S mod 4), если такая существует или 0.

Что изменится в программе, если надо найти максимальную сумму, кратную 4?

Для хранения минимальных разностей, которые при делении на 4 дают остатки 1, 2, 3 заведём глобальный массив d_min из трёх элементов с индексами 1, 2, 3, соответствующими остаткам от деления на 4.

Тогда ответом будет сумма S если она кратна 4,

или S – разность, соответствующая (S mod 4), если такая существует или 0.

0) and (x d_min[ost_x]:= x; If (ost_y 0) and (y d_min[ost_y]:= y; end; » width=»640″

Задание Б. Язык программирования PascalABC .

сonst aMax = 10000 ; // наибольшее возможное число в исходных данных

Var N, i : longint; //количество пар, переменная цикла

a, b, с : longint ; //тройка чисел

S : longint; //сумма выбранных чисел

d_min : array[1..3] of longint; //минимальная разница не кратная 4

procedure min4 (x, y : longint);

var ost_x, ost_y : byte;

begin

ost_x := x mod 4; ost_y := y mod 4;

If (ost_x 0) and (x

d_min[ost_x]:= x;

If (ost_y 0) and (y

d_min[ost_y]:= y;

end;

= b) and (a = c) then // a — максимум begin s := s + a; min4(a-b, a-c) end else if (b = a) and (b = c) then // b — максимум begin s := s + b; min4(b-a, b-c) end else // c — максимум begin s := s + c; min4(c-a, c-b) end; end; If (s mod 4 0) then If (d_min[s mod 4] aMax ) then s := 0 else s := s — d_min[s mod 4] ; writeln(s); end. » width=»640″

begin

s := 0;

for i := 1 to 3 do d_min[i] := aMax + 1;

readln(N);

for i := 1 to N do begin

readln(a, b, c);

if (a = b) and (a = c) then // a — максимум

begin s := s + a; min4(a-b, a-c) end

else if (b = a) and (b = c) then // b — максимум

begin s := s + b; min4(b-a, b-c) end

else // c — максимум

begin s := s + c; min4(c-a, c-b) end;

end;

If (s mod 4 0) then

If (d_min[s mod 4] aMax ) then s := 0

else s := s — d_min[s mod 4] ;

writeln(s);

end.

Что изменится в алгоритме, если надо найти максимальную сумму, кратную 4,  но в тройке чисел выбирать два числа? Алгоритм подсчёта суммы: в тройке чисел будем искать минимальное значение и прибавлять в сумму два больших. Для сохранения минимальных разностей отправляем в процедуру min4 разности двух больших чисел с меньшим, например, если а – минимум, то отправим (в-а) и (с-а ).

Что изменится в алгоритме, если надо найти максимальную сумму, кратную 4, но в тройке чисел выбирать два числа?

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

Для сохранения минимальных разностей отправляем в процедуру min4 разности двух больших чисел с меньшим, например, если а – минимум, то отправим (в-а) и (с-а ).

0) and (x d_min[ost_x]:= x; If (ost_y 0) and (y d_min[ost_y]:= y; end; » width=»640″

Задание Б. Язык программирования PascalABC.

сonst aMax = 10000; //наибольшее возможное число в исх. данных

Var N, i : longint; //количество пар, переменная цикла

a, b, с : longint; //тройка чисел

S : longint; //сумма выбранных чисел

//минимальная разница не кратная 4

d_min : array[1..3] of longint;

procedure min4 (x, y : longint);

var ost_x, ost_y : byte;

begin

ost_x := x mod 4; ost_y := y mod 4;

If (ost_x 0) and (x

d_min[ost_x]:= x;

If (ost_y 0) and (y

d_min[ost_y]:= y;

end;

aMax) then s := 0 else s := s — d_min[s mod 4]; writeln(s); end. » width=»640″

begin

s := 0;

for i := 1 to 3 do d_min[i] := aMax + 1;

readln(N);

for i := 1 to N do begin

readln(a, b, c);

if (a // a — минимум

begin s := s + b + c; min4(b-a, c-a) end

else if (b // b — минимум

begin s := s + a + c; min4(a-b, c-b) end

else // c — минимум

begin s := s + a + b; min4(a-c, b-c) end;

end;

If (s mod 4 0) then

If (d_min[s mod 4] aMax) then s := 0

else s := s — d_min[s mod 4];

writeln(s);

end.

К задаче 2

К задаче 2

К началу презентации

К началу презентации

Конец

Конец


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

Версия для печати и копирования в MS Word

1

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

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

Файл A

Файл B

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

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

6

1 3

5 12

6 9

5 4

3 3

1 1

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

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

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

Ответ:

Источник: Демонстрационная версия ЕГЭ−2021 по информатике


2

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

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

Файл A

Файл B

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

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

6

1 3

5 12

6 9

5 4

3 3

1 1

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

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

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

Ответ:


3

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

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

Файл A

Файл B

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

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

6

1 3

5 12

6 9

5 4

3 3

1 1

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

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

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

Ответ:


4

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

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

Файл A

Файл B

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

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

5

40

1000

7

28

55

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

28000

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

Ответ:


5

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

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

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

Файл A

Файл B

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

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

4

2

6

13

39

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

4

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

Ответ:

Пояснение. Из четырёх заданных чисел можно составить 6 попарных произведений: 2 · 6, 2 · 13, 2 · 39, 6 · 13, 6 · 39, 13 · 39 (результаты: 12, 26, 78, 78, 234, 507). Из них на 26 делятся 4 произведения (2 · 13  =  26; 2 · 39  =  78; 6 · 13  =  78; 6 · 39  =  234).

Пройти тестирование по этим заданиям

Понравилась статья? Поделить с друзьями:
  • Решение 26 задания егэ по информатике 2022 excel
  • Решение задач в excel стоимость
  • Решение 19 21 задания егэ по информатике 2021 в excel
  • Решение задач в excel с помощью финансовых функций
  • Решебник по английскому языку 5 класс книга excel