Анализ информационных моделей. Неоднозначное соотнесение таблицы и графа
i
На рисунке схема дорог N-ского района изображена в виде графа, в таблице содержатся сведения о протяжённости каждой из этих дорог (в километрах).
П1
П2
П3
П4
П5
П6
П7
П1
3
4
П2
3
12
13
П3
10
11
П4
10
9
7
П5
4
12
11
9
8
6
П6
13
8
5
П7
7
6
5
Так как таблицу и схему рисовали независимо друг от друга, то нумерация населённых пунктов в таблице никак не связана с буквенными обозначениями на графе. Определите, какова сумма протяжённостей дорог из пункта Б в пункт В и из пункта Г в пункт Д.
В ответе запишите целое число.
Решение. Заметим, что К — единственная вершина шестой степени, значит, К соответствует П5. Вершины А и Е — единственные вершины степени 2, тогда они могут соответствовать П1 и П3. Вершины Б и Д связаны с вершинами А и Е, тогда из таблицы получаем, что они могут соответствовать П2 и П4. Тогда В и Г могут соответствовать П6 и П7.
Заметим, что точное соответствие букв пунктам не важно. Таким образом, сумма протяжённостей дорог из пункта Бв пункт В и из пункта Г в пункт Д равна 13 + 7 = 20.
Ответ: 20.
Приведём решение Артёма Гридина на языке Python.
from itertools import permutations
table = '25 156 45 357 123467 257 456'.split()
graph = 'КА КБ КВ КГ КД КЕ АБ БВ ВГ ГД ДЕ'.split()
print('1 2 3 4 5 6 7')
for p in permutations('АБВГДЕК'):
if all(str(p.index(c2)+1) in table[p.index(c1)] for c1, c2 in graph):
Построение таблиц истинности логических выражений. Строки с пропущенными значениями
i
Миша заполнял таблицу истинности логической функции F
¬ (y → (x ≡ w)) ∧ (z → x),
но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
Переменная 1
Переменная 2
Переменная 3
Переменная 4
Функция
1
1
1
0
0
1
0
1
0
1
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить
не нужно.
Пример. Функция F задана выражением ¬ x ∨ y, зависящим от двух переменных, а фрагмент таблицы имеет следующий вид:
Переменная 1
Переменная 2
Функция
???
???
F
0
1
0
В этом случае первому столбцу соответствует переменная y, а второму столбцу — переменная x. В ответе следует написать: yx.
Решение. Составим таблицу истинности для выражения ¬ (y → (x ≡ w)) ∧ (z → x) вручную или при помощи языка Python:
print("x y z w")
for x in range(0, 2):
for y in range(0, 2):
for z in range(0, 2):
for w in range(0, 2):
if not(y <= (x == w)) and (z <= x):
print(x, y, z, w)
Далее выпишем те наборы переменных, при которых данное выражение равно 1. В наборах переменные запишем в порядке х, y, z, w. Получим следующие наборы:
(0, 1, 0, 1),
(1, 1, 0, 0),
(1, 1, 1, 0).
Сопоставим эти наборы с приведенным в задании фрагментом таблицы истинности.
Первая строка таблицы может соответствовать только набору (1, 1, 1, 0), поскольку в двух других строках точно есть два нуля. Следовательно, переменная w может соответствовать либо первому, либо четвёртому столбцу. Поскольку в оставшихся двух строках таблицы в четвёртом столбце стоит 0, а из оставшихся двух наборов только в одном переменная w равна 0, переменная w соответствует первому столбцу.
Рассмотрим третью строку таблицы. Эта строка может соответствовать только набору (0, 1, 0, 1), поскольку переменная w должна быть равна 1. Следовательно, в ней y = 1 и w = 1 и y соответствует третьему столбцу.
Рассмотрим вторую строку таблицы. Эта строка может соответствовать только набору (1, 1, 0, 0). Следовательно, в ней z = 0 и w = 0 и z соответствует четвёртому столбцу. Тогда второй столбец — это переменная x.
Поиск информации в реляционных базах данных. Задания для подготовки
i
В файле приведён фрагмент базы данных «Продукты» о поставках товаров в магазины районов города. База данных состоит из трёх таблиц.
Таблица «Движение товаров» содержит записи о поставках товаров в магазины в течение первой декады июня 2021 г., а также информацию о проданных товарах. Поле Тип операции содержит значение Поступление или Продажа, а в соответствующее поле Количество упаковок, шт. занесена информация о том, сколько упаковок товара поступило в магазин или было продано в течение дня. Заголовок таблицы имеет следующий вид.
ID операции
Дата
ID магазина
Артикул
Тип операции
Количество упаковок, шт.
Цена, руб./шт.
Таблица «Товар» содержит информацию об основных характеристиках каждого товара. Заголовок таблицы имеет следующий вид.
Артикул
Отдел
Наименование
Ед. изм.
Количество в упаковке
Поставщик
Таблица «Магазин» содержит информацию о местонахождении магазинов. Заголовок таблицы имеет следующий вид.
ID магазина
Район
Адрес
На рисунке приведена схема указанной базы данных.
Используя информацию из приведённой базы данных, определите, на сколько увеличилось количество упаковок яиц диетических, имеющихся в наличии в магазинах Заречного района за период с 1 по 10 июня.
В ответе запишите только число.
Решение. Открыв файл, перейдём на лист «Магазин». Воспользуемся стандартными средствами редактора Microsoft Excel, требуется отфильтровать записи в таблице, оставив только записи для магазинов Заречного района. Для этого включим фильтр:
Получаем следующую таблицу:
A
B
C
1
ID магазина
Район
Адрес
4
M3
Заречный
Колхозная, 11
10
M9
Заречный
Прибрежная, 7
12
M11
Заречный
Луговая, 21
15
M14
Заречный
Элеваторная, 15
Перейдём на лист «Товар». В этой таблице, воспользовавшись средствами поиска, найдём строку с товаром «Яйцо диетическое». Артикул товара — 15:
16
15
Яйцо диетическое
шт.
10
Птицефабрика
Теперь перейдём на лист «Движение товаров». Снова воспользуемся фильтром по столбцу «ID магазина», чтобы вывести в таблице только те записи, которые относятся к магазинам Заречного района. В фильтре отметим те ID магазинов, которые были найдены в таблице «Магазин», — M3, M9, M11 и M14. Также применим фильтр к столбцу «Артикул», чтобы оставить только записи о движении товаров по артикулу 15. В результате получим следующую таблицу:
A
B
C
D
E
F
G
1
ID операции
Дата
ID магазина
Артикул
Количество
упаковок, шт.
Тип операции
Цена
руб./шт.
1318
1317
04.06.2021
M11
15
180
Поступление
70
1319
1318
04.06.2021
M11
15
108
Продажа
70
1324
1323
04.06.2021
M14
15
170
Поступление
70
1325
1324
04.06.2021
M14
15
76
Продажа
70
1332
1331
04.06.2021
M3
15
180
Поступление
70
1333
1332
04.06.2021
M3
15
108
Продажа
70
1344
1343
04.06.2021
M9
15
180
Поступление
70
1345
1344
04.06.2021
M9
15
90
Продажа
70
2090
2089
08.06.2021
M11
15
180
Поступление
70
2091
2090
08.06.2021
M11
15
36
Продажа
70
2132
2131
08.06.2021
M14
15
180
Поступление
70
2133
2132
08.06.2021
M14
15
0
Продажа
70
2188
2187
08.06.2021
M3
15
170
Поступление
70
2189
2188
08.06.2021
M3
15
24
Продажа
70
2272
2271
08.06.2021
M9
15
180
Поступление
70
2273
2272
08.06.2021
M9
15
12
Продажа
70
Далее необходимо посчитать количество упаковок яиц диетических, имеющихся в наличии в магазинах Заречного района. Заметим, что все движения попадают в период с 1 по 10 июня включительно. Скопируем полученную таблицу на отдельный лист и отсортируем записи по столбцу «Тип операции». В результате получаем следующую таблицу:
A
B
C
D
E
F
G
1
ID операции
Дата
ID магазина
Артикул
Количество
упаковок, шт.
Тип операции
Цена
руб./шт.
2
1317
04.06.2021
M11
15
180
Поступление
70
3
1323
04.06.2021
M14
15
170
Поступление
70
4
1331
04.06.2021
M3
15
180
Поступление
70
5
1343
04.06.2021
M9
15
180
Поступление
70
6
2089
08.06.2021
M11
15
180
Поступление
70
7
2131
08.06.2021
M14
15
180
Поступление
70
8
2187
08.06.2021
M3
15
170
Поступление
70
9
2271
08.06.2021
M9
15
180
Поступление
70
10
1318
04.06.2021
M11
15
108
Продажа
70
11
1324
04.06.2021
M14
15
76
Продажа
70
12
1332
04.06.2021
M3
15
108
Продажа
70
13
1344
04.06.2021
M9
15
90
Продажа
70
14
2090
08.06.2021
M11
15
36
Продажа
70
15
2132
08.06.2021
M14
15
0
Продажа
70
16
2188
08.06.2021
M3
15
24
Продажа
70
17
2272
08.06.2021
M9
15
12
Продажа
70
Окончательно, воспользовавшись формулой =СУММ(E2:E9)-СУММ(E10:E17), получаем ответ — 966.
Кодирование и декодирование информации. Передача информации. Выбор кода
i
Для кодирования некоторой последовательности, состоящей из букв Л, М, Н, П, Р, решили использовать неравномерный двоичный код, удовлетворяющий условию, что никакое кодовое слово не является началом другого кодового слова. Это условие обеспечивает возможность однозначной расшифровки закодированных сообщений. Для букв Л, М, Н использовали соответственно кодовые слова 00, 01, 11. Для двух оставшихся букв — П и Р — кодовые слова неизвестны.
Укажите кратчайшее возможное кодовое слово для буквы П, при котором код будет удовлетворять указанному условию. Если таких кодов несколько, укажите код с наименьшим числовым значением.
Решение. Для трёх букв кодовые слова уже известны, осталось подобрать для оставшихся двух букв такие кодовые слова, которые будут являться кратчайшими и удовлетворять условию Фано.
Кодовым словом не могут быть ни 0, ни 1, потому что есть кодовые слова, начинающиеся с 0 и 1. Для буквы П нельзя использовать кодовое слово 10, поскольку в этом случае нельзя будет закодировать букву Р. Для кодирования букв П и Р можно использовать кодовые слова 100 и 101. Кратчайшее слово с наименьшим числовым значением — 100.
Анализ и построение алгоритмов для исполнителей.Посимвольное двоичное преобразование
i
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. К этой записи дописываются справа ещё два разряда по следующему правилу:
а) складываются все цифры двоичной записи числа N, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001;
б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью результирующего числа R.
Укажите такое наименьшее число N, для которого результат работы алгоритма больше числа 77. В ответе это число запишите в десятичной системе счисления.
Решение. Если изначально сумма разрядов была чётная, то в конец запишется 00, что эквивалентно
Если же сумма была нечётная, то запишется 10, что эквивалентно
В обоих случаях число получается чётным.
Посмотрим на чётные числа, превосходящие 77.
— на конце 10, а сумма остальных разрядов нечётна. Число подходит под второй случай, значит, число, из которого оно было получено, равно
Ответ: 19.
Приведём другое решение на языке Python.
def f(s):
summa = 0
for i in range(len(s)):
summa += int(s[i])
return summa
for n in range(1, 100):
s = bin(n)[2:] # перевод в двоичную систему
s = str(s)
s = s + str(f(s) % 2)
s = s + str(f(s) % 2)
r = int(s, 2) # перевод в десятичную систему
if r > 77:
print(n)
break
Приведём решение Глеба Придатько на языке Python.
Анализ программ. Условие выполнения цикла while. Часть 1
i
Определите, при каком наибольшем введённом значении переменной s программа выведет число 64. Для Вашего удобства программа представлена на четырёх языках программирования.
Си++
Python
#include <iostream>
using namespace std;
int main() {
int s, n;
cin >> s;
s = s / 10;
n = 1 ;
while (s < 51) {
s = s + 5;
n = n * 2;
}
cout << n << endl;
return 0;
}
s = int(input())
s = s // 10
n = 1
while s < 51:
s = s + 5
n = n * 2
print(n)
Паскаль
Алгоритмический язык
var s, n: integer;
begin
readln (s);
s := s div 10;
n := 1;
while s < 51 do
begin
s := s + 5;
n := n * 2
end;
writeln(n)
end.
алг
нач
цел n, s
ввод s
s := div( s, 10)
n := 1
нц пока s < 51
s := s + 5
n := n * 2
кц
вывод n
кон
Решение. Заметим, что число 64 это 2 в шестой степени. Значит, цикл должен выполниться 6 раз. Максимальное число, при котором цикл выполнится последний раз — 50. А следующий шаг — 55 уже не пройдет. Тогда ответ — 55 − 5 · 6 = 25. А так как на первом шаге берется целое от деления на 10, то третью цифру нужно взять максимально возможную — 9.
Ответ: 259.
Примечание.
Требуется определить наибольшее число, при котором программа выведет 64. Число 210, при котором программа тоже выведет 64, не подходит, поскольку оно меньше 259.
Кодирование и декодирование информации. Передача информации. Хранение изображений. Передача изображений
i
Для хранения произвольного растрового изображения размером 128 × 320 пикселей отведено 20 Кбайт памяти без учёта размера заголовка файла. Для кодирования цвета каждого пикселя используется одинаковое количество бит, коды пикселей записываются в файл один за другим без промежутков. Какое максимальное количество цветов можно использовать в изображении?
Решение. Объём растрового изображения находится как произведение количества пикселей в изображении на объём памяти x, необходимый для хранения цвета одного пикселя: 128 · 320 · x < 20 · 213 бит, откуда x = 4 бит. Значит, в изображении можно использовать не более 24 = 16 цветов.
Все четырёхбуквенные слова, в составе которых могут быть только буквы Л, Е, М, У, Р, записаны в алфавитном порядке и пронумерованы, начиная с 1. Ниже приведено начало списка.
1. ЕЕЕЕ
2. ЕЕЕЛ
3. ЕЕЕМ
4. ЕЕЕР
5. ЕЕЕУ
6. ЕЕЛЕ
...
Под каким номером в списке идёт первое слово, которое начинается с буквы Л?
Решение. Из пяти букв можно составить 54 = 625 четырёхбуквенных слов. Поскольку слова идут в алфавитном порядке, то первая одна пятая часть букв (125 шт.) начинается с Е, вторая часть (тоже 125) — с Л, третья — с М, четвёртая — с Р, последняя — с У, то есть первая буква меняется через каждые 125 слов. То есть со слова с номером 126 первой буквой будет Л.
Выясните, какое количество троек чисел может являться сторонами треугольника, то есть удовлетворяет неравенству треугольника. В ответе запишите только число.
Решение. Неравенство треугольника будет заведомо выполнено для всех сторон треугольника, если длина наибольшей стороны треугольника будет меньше суммы длин других двух сторон. В ячейке D1 запишем формулу =МАКС(A1:C1) и скопируем её во все ячейки диапазона D2:D5000. В ячейке E1 запишем формулу =СУММ(A1:C1)-МАКС(A1:C1) и скопируем её во все ячейки диапазона E2:E5000. Таким образом, получим длину наибольшей стороны и сумму других двух сторон для каждой тройки чисел. После этого в ячейку F1 запишем формулу =ЕСЛИ(D1<E1;1;0) и скопируем её во все ячейки диапазона F2:F5000. Теперь, воспользовавшись формулой =СУММ(F1:F5000), получим ответ — 2453.
Ответ: 2453.
Примечание.
В учебниках геометрии треугольник определяется как фигура, состоящая из трех точек, не лежащих на одной прямой, и трех соединяющих их отрезков. Неравенство треугольника формулируется так: каждая сторона треугольника меньше суммы двух других сторон. Поэтому три точки, лежащие на одном отрезке, рассматривать как треугольник не следует, учитывать в ответе этот случай не нужно. Причины для такого подхода понятны: геометрия изучает свойства фигур, а вырожденные объекты теряют свойства исходных фигур.
Приведём решение Сергея Калугина на языке Python.
cnt = 0
f = open('9.csv')
for s in f:
a = list(map(int,s.split(';')))
a.sort()
if a[0] + a[1] > a[2]:
cnt+=1
print(cnt)
Примечание. Файл следует сохранить в формате CSV.
Приведём решение Артёма Гридина на языке Python.
print([True if y[2] < sum(y[:2]) else False for y in tuple(map(lambda x: sorted(tuple(map(int, x.split(';')))), open('9.csv').read().splitlines()))].count(True))
Примечание. Файл следует сохранить в формате CSV.
Приведём решение Юрия Красильникова на языке Python.
# Необходимо предварительно сохранить данные из таблицы LibreOffice Calc
# в файл .csv с разделителем ';'
ответ = 0
for строка in open('9.csv'):
числа = list(map(int, строка.split(';')))
if 2*max(числа) < sum(числа): ответ += 1
print(ответ)
Примечание. Файл следует сохранить в формате CSV.
Приведём решение Юрия Красильникова на языке Python.
a = [list(map(int,s.split(';'))) for s in open('9.csv')]
print(len([1 for x in a if 2*max(x) < sum(x)]))
Примечание. Файл следует сохранить в формате CSV.
Приведём решение Сергея Донец на языке PascalABC.NET.
uses XLSX;
begin
var a:=ReadXLSXAsInts('38588.xlsx')
.Select(n->n.Order)
.Count(\(a,b,c)->a+b>c)
.Println;
end.
Примечание. Файл следует сохранить в формате xlsx.
Поиск символов в текстовом редакторе. Задания для подготовки
i
С помощью текстового редактора определите, сколько раз, не считая сносок, встречается слово «долг» или «Долг» в тексте романа в стихах А. С. Пушкина «Евгений Онегин». Другие формы слова «долг», такие как «долги», «долгами» и т. д., учитывать не следует. В ответе укажите только число.
Вычисление количества информации. Пароли с дополнительными сведениями
i
При регистрации в компьютерной системе каждому пользователю выдаётся идентификатор, состоящий из 15 символов и содержащий только символы из 8-символьного набора: А, В, C, D, Е, F, G, H. В базе данных для хранения сведений о каждом пользователе отведено одинаковое и минимально возможное целое число байт. При этом используют посимвольное кодирование идентификаторов, все символы кодируют одинаковым и минимально возможным количеством бит. Кроме собственно идентификатора, для каждого объекта в системе хранятся дополнительные сведения, для чего отведено 24 байт на один объект.
Определите объём памяти (в байтах), необходимый для хранения сведений о 20 объектах. В ответе запишите только целое число — количество байт.
Решение. Согласно условию, в идентификаторе могут быть использованы 8 символов. Известно, что с помощью N бит можно закодировать 2N различных вариантов. Поскольку 23 = 8, то для записи каждого из 8 символов необходимо 3 бит.
Для хранения всех 15 символов пароля нужно 3 · 15 = 45 бит, а так как для записи используется целое число байт, то берём ближайшее не меньшее значение, кратное восьми, это число 48 = 6 · 8 бит(6 байт).
Для хранения всех сведений об одном пользователе используется 6 + 24 = 30 байт. Таким образом, для хранения сведений о двадцати пользователях необходимо 30 · 20 = 600 байт.
Выполнение алгоритмов для исполнителей. Исполнитель Редактор
i
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки vна цепочку w. Например, выполнение команды заменить (111, 27) преобразует строку 05111150в строку 0527150.
Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка
исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 70 идущих подряд цифр 8? В ответе запишите полученную строку.
НАЧАЛО
ПОКА нашлось (2222) ИЛИ нашлось (8888)
ЕСЛИ нашлось (2222)
ТО заменить (2222, 88)
ИНАЧЕ заменить (8888, 22)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
Решение. Данный алгоритм сначала заменит четыре первых восьмёрки на две двойки, на следующем шаге цикла сделает то же самое, а на третьем шаге цикла заменит четыре получившихся двойки на две восьмёрки. Получаем, что каждые три шага цикла из последовательности удаляется шесть восьмёрок.Через одиннадцать троек шагов цикла в последовательности останется четыре восьмёрки. На последнем шаге цикла они будут заменены на две двойки.
Поиск путей в графе. Подсчёт путей с обязательной вершиной
i
На рисунке представлена схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, З, И, К, Л, М. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой.
Сколько существует различных путей из города А в город М, проходящих через город В?
Решение. Количество путей до города Х = количество путей добраться в любой из тех городов, из которых есть дорога в Х.
При этом если путь должен не проходить через какой-то город, нужно просто не учитывать этот город при подсчёте сумм. А если город наоборот обязательно должен лежать на пути, тогда для городов, в которые из нужного города идут дороги, в суммах нужно брать только этот город.
С помощью этого наблюдения посчитаем последовательно количество путей до каждого из городов:
А = 1
Б = А = 1
Д = А = 1
Г = А + Д = 1 + 1 = 2
В = А + Б + Г = 4
З = В = 4 (Г и Д не учитываем, поскольку путь должен проходить через В)
Ж = В + З = 4 + 4 = 8 (Е не учитываем, поскольку путь должен проходить через В)
И = З + Ж = 4 + 8 = 12
К = Л = И =12
М = К + Л = 24
Примечание. Необходимо найти количество различных путей из города А в город М, проходящих через город В.
Приведем другое решение.
Количество путей из города А в город М, проходящих через город В, равно произведению количества путей из города А в город В и количества путей из города В в город М.
Найдем количество путей из города А в город В:
А = 1
Б = А = 1
Д = А = 1
Г = А + Д = 1 + 1 = 2
В = А + Б + Г = 4.
Заметим, что из города В в город М можно добраться только через город И. Следовательно, количество путей из города В в город М равно произведению количества путей из города В в город И и количества путей из города И в город М.
Найдем количество путей из города В в город И (при этом В — исходный пункт):
В = 1
З = В =1
Ж = В + З = 1 + 1 = 2
И = З + Ж = 1 + 2 = 3.
Из города И в город М есть два пути: И—К—М и И—Л—м.
Таким образом, количество путей из города А в город М, проходящих через город В, равно 4 · 3 · 2 = 24.
Это число в системе счисления с основанием 16 будет выглядеть как тройка, семь нулей, восьмёрка, единица, семь нулей, шестнадцатеричное число Е, ноль и единица. Таким образом, всего 15 нулей.
На числовой прямой даны два отрезка: D = [17; 58] и C = [29; 80]. Укажите наименьшую возможную длину такого отрезка A, для которого логическое выражение
D → (¬C ∧ ¬A) → ¬D ⇔ ¬D ∨ C ∨ A ∨ ¬D ⇔ ¬D ∨ A ∨ C.
Логическое ИЛИ истинно, если истинно хотя бы одно утверждение. Условие ¬D ∨ C истинно на множестве (−∞, 17) ∪ [29, ∞). Тогда A должно быть истинным на множестве [17; 29). Значит, наименьшая возможная длина интервала A равна 29 − 17 = 12.
Ответ: 12.
Примечание.
О длине отрезка написано в примечании к задаче 11119.
Обработки числовой последовательности. Задания для подготовки
i
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от −10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых хотя бы одно число делится на 3, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности. Например, для последовательности из пяти элементов: 6; 2; 9; –3; 6 — ответ 4 11.
Решение. Будем последовательно считывать числа из файла. Для каждой пары (двух подряд идущих элементов) будем проверять, делится ли хотя бы одно число из пары на 3. При успешном выполнении условия будем увеличивать значения счётчика count и проверять, больше ли сумма элементов пары текущей максимальной суммы. Если сумма элементов пары больше текущей максимальной суммы, будем обновлять значение переменной maxsum.
Приведём решение задачи на языке Pascal.
var
x, y, count: longint;
maxsum: longint;
f: text;
begin
assign(f,'C:\17.txt');
reset(f);
readln(f, x);
maxsum := -20001;
count := 0;
while not eof(f) do begin
readln(f, y);
if (x mod 3 = 0) or (y mod 3 = 0) then begin
count := count + 1;
if x + y > maxsum then maxsum := x + y;
end;
x := y;
end;
writeln(count, ' ', maxsum);
end.
Приведём решение Николая Чуркина (Тимашевск) на языке Python.
count = 0
m = -20001
f = open('17.txt')
l = [int(i) for i in f]
for i in range(len(l) - 1):
if (l[i] % 3 == 0) or (l[i + 1] % 3 == 0):
count += 1
m = max(m, l[i]+ l[i + 1])
print(count, m)
В результате работы данного алгоритма при вводе данных из файла ответ — 2802 1990.
Примечание.
Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём решение Сергея Донец на PascalABC.NET:
begin
var p:=ReadAllLines('17.txt').Select(x->x.tointeger);
var m:=p.Pairwise.Where(\(a,b)->a.divs(3)or b.divs(3));
Квадрат разлинован на N × N клеток (1 < N < 30). Исполнитель Робот может перемещаться по клеткам, выполняя за одно перемещение одну из двух команд: вправо или вниз. По команде вправо Робот перемещается в соседнюю правую клетку, по команде вниз — в соседнюю нижнюю. Квадрат ограничен внешними стенами. Между соседними клетками квадрата также могут быть внутренние стены. Сквозь стену Робот пройти не может. Перед каждым запуском Робота в каждой клетке квадрата лежит монета достоинством от 1 до 100. Посетив клетку, Робот забирает монету с собой; это также относится к начальной и конечной клеткам маршрута Робота.
Определите максимальную и минимальную денежные суммы, которые может собрать Робот, пройдя из левой верхней клетки в правую нижнюю.
В ответе укажите два числа — сначала максимальную сумму, затем минимальную.
Исходные данные представляют собой электронную таблицу размером N × N, каждая ячейка которой соответствует клетке квадрата. Внутренние и внешние стены обозначены утолщенными линиями.
Пример входных данных:
1
8
8
4
10
1
1
3
1
3
12
2
2
3
5
6
Для указанных входных данных ответом должна быть пара чисел 38 и 22.
Решение. Сначала найдём максимальную денежную сумму. Для этого найдём максимальную денежную сумму для каждой ячейки таблицы. Для каждой ячейки верхней строки это будет сумма всех ячеек слева от текущей. Для каждой ячейки левого столбца это будет сумма всех ячеек сверху от текущей. В ячейку A22 запишем формулу =СУММ($A$1:A1). Скопируем эту формулу во все ячейки в диапазоне B22:T22 и в диапазоне A23:A41.
Для остальных ячеек будем сравнивать значение ячейки слева и значение ячейки сверху и присваивать текущей ячейке значение суммы той ячейки, в которой значение больше, и текущей ячейки. В B23 запишем формулу =МАКС(A23+B2;B22+B2) и скопируем эту формулу во все оставшиеся ячейки диапазона B23:T41.
Для ячеек G25:G36, поскольку слева от них имеется внутренняя стенка, максимальная денежная сумма вычисляется как сумма текущей ячейки и суммы сверху, в ячейку G25 запишем формулу =G24+G4 и скопируем её во все ячейки диапазона G26:G36. Для ячеек L39:Q39, поскольку сверху от них имеется внутренняя стенка, максимальная денежная сумма вычисляется как сумма текущей ячейки и суммы слева, в ячейку L39 запишем формулу =K39+L18 и скопируем её во все ячейки диапазона M39:Q39. Таким образом, в ячейке T41 получим значение максимальной денежной суммы — 721.
Аналогичным образом найдём значение минимальной денежной суммы. Ячейки диапазонов B22:T22 и A23:A41, G25:G36 и L39:Q39 заполняются также, как при поиске максимальной денежной суммы. В B23 запишем формулу =МИН(A23+B2;B22+B2) и скопируем эту формулу во все оставшиеся ячейки диапазона B23:T41. Таким образом, в ячейке T41 получим значение минимальной денежной суммы — 640.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 29. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 29 или больше камней.
В начальный момент в куче было S камней, 1 ≤ S ≤ 28.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Решение. Такое значение S — 14. При значениях S < 14 у Пети есть возможность сделать такой ход, что Ваня не сможет выиграть своим первым ходом. При значении S = 14 Петя своим первым ходом может получить 15 или 28 камней в куче. Во всех случаях Ваня увеличивает количество камней в куче в два раза и выигрывает своим первым ходом.
Ответ: 14.
Приведём другое решение на языке Python.
def f(x, h):
if h == 3 and x >= 29:
return 1
elif h == 3 and x < 29:
return 0
elif x >= 29 and h < 3:
return 0
else:
if h % 2 == 0:
return f(x + 1, h + 1) or f(x * 2, h + 1) # стратегия победителя
else:
return f(x + 1, h + 1) and f(x * 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 29):
if f(x, 1) == 1:
print(x)
break
Приведём решение Артёма Гридина на языке Python.
import sys
f = lambda s,m:(m/2).is_integer()if(s > 28)else((m)if(not(m))else(any([f(True+s,m-True),f(s+s,m-True)])if(not(.5*m==m//2))else(all([f(True+s,m-True),f(s+s,m-True)]))))
sys.stdout.write(*[str(s)for s in range(True,29)if(f(s,2))])
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 29. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 29 или больше камней.
В начальный момент в куче было S камней;1 ≤ S ≤ 28.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Найдите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.
Решение. Заметим, что значение S должно быть меньше 14, поскольку иначе Ваня сможет выиграть своим первым ходом. Первое значение S — 13. В этом случае Петя может добавить в кучу один камень, получив кучу с 14 камнями, и при любом ходе Вани выиграть своим вторым ходом.
Второе значение S — 7. В этом случае Петя может увеличить количество камней в куче в два раза и получить кучу из 14 камней. При любом ходе Вани Петя выигрывает своим вторым ходом.
Ответ: 713.
Приведём другое решение на языке Python.
def f(x, h):
if h == 4 and x >= 29:
return 1
elif h == 4 and x < 29:
return 0
elif x >= 29 and h < 4:
return 0
else:
if h % 2 != 0:
return f(x + 1, h + 1) or f(x * 2, h + 1) # стратегия победителя
else:
return f(x + 1, h + 1) and f(x * 2, h + 1) # стратегия проигравшего
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 29. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 29 или больше камней.
В начальный момент в куче было S камней, 1 ≤ S ≤ 28.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Для игры, описанной в задании 19, найдите значение S, при котором одновременно выполняются два условия:
— у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Если найдено несколько значений S, в ответе запишите минимальное из них.
Решение. Такое значение S — 12. Петя своим первым ходом может получить позиции 13 или 24. При S = 24 Ваня увеличивает количество камней в куче в два раза и выигрывает своим первым ходом. При S = 13 Ваня добавляет в кучу один камень. Тогда, вне зависимости от хода Пети, Ваня выигрывает своим вторым ходом.
Ответ: 12.
Приведём другое решение на языке Python.
Исключим стратегию Вани, которая позволит ему гарантированно выиграть первым ходом:
def f(x, h):
if (h == 3 or h == 5) and x >= 29:
return 1
elif h == 5 and x < 29:
return 0
elif x >= 29 and h < 5:
return 0
else:
if h % 2 == 0:
return f(x + 1, h + 1) or f(x * 2, h + 1) # стратегия победителя
else:
return f(x + 1, h + 1) and f(x * 2, h + 1) # стратегия проигравшего
def f1(x, h):
if h == 3 and x >= 29:
return 1
elif h == 3 and x < 29:
return 0
elif x >= 29 and h < 3:
return 0
else:
if h % 2 == 0:
return f1(x + 1, h + 1) or f(x * 2, h + 1) # стратегия победителя
else:
return f1(x + 1, h + 1) and f(x * 2, h + 1) # стратегия проигравшего(любой ход)
for x in range(1, 29):
if f(x, 1) == 1:
print(x)
print("====")
for x in range(1, 29):
if f1(x, 1) == 1:
print(x) # Исключим эти значения из списка выше
Анализ программы с циклами и условными операторами .Посимвольная обработка чисел в разных СС
i
Ниже на четырех языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M. Укажите наибольшее число x, при вводе которого алгоритм печатает сначала 4, а потом 5.
C++
Python
#include <iostream>
using namespace std;
int main()
{
int x, L, M, Q;
cin >> x;
Q = 9;
L = 0;
while (x >= Q){
L = L + 1;
x = x - Q;
}
M = x;
if (M < L){
M = L;
L = x;
}
cout << L << endl << M << endl;
return 0;
}
x = int(input())
Q = 9
L = 0
while x >= Q:
L = L + 1
x = x - Q
M = x
if M < L:
M = L
L = x
print(L)
print(M)
Паскаль
Алгоритмический язык
var x, L, M, Q: integer;
begin
readln(x);
Q := 9;
L := 0;
while x >= Q do begin
L := L + 1;
x := x - Q;
end;
M := x;
if M < L then begin
M := L;
L := x;
end;
writeln(L);
writeln(M);
end.
алг
нач
цел x, L, M, Q
ввод x
Q := 9
L := 0
нц пока x >= Q
L := L + 1
x := x - Q
кц
M := x
если M < L
то
M := L
L := x
все
вывод L, нс, M
кон
Решение. Данный алгоритм ищет два числа числа: целая часть от деления значения x на 9 и остаток от деления значения x на 9. Далее, если остаток от деления числа x на 9 меньше, чем целая часть от этого деления, алгоритм меняет местами значения L и M.
Заметим, что в результате работы алгоритма на экран будут выведены два числа: 4 и 5. Значит, чтобы найти наибольшее число x, число 5 должно являться целой частью от деления x на 9, а число 4 — остатком от деления x на 9. Таким образом, получаем ответ — x = 9 · 5 + 4 = 49.
Оператор присваивания и ветвления. Перебор вариантов, построение дерева. Количество программ с обязательным этапом
i
Исполнитель преобразует число на экране.
У исполнителя есть две команды, которым присвоены номера.
1. Прибавить 1.
2. Умножить на 2.
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя — это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 20 и при этом траектория вычислений содержит число 10?
Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 121 при исходном числе 7 траектория будет состоять из чисел 8, 16, 17.
Решение. Искомое количество программ равно произведению количества программ, получающих из числа 1 число 10, на количество программ, получающих из числа 10число 20.
Пусть R(n) — количество программ, которые число 1 преобразуют в число n, F(n) — количество программ, которые число 10 преобразуют в число n.
Верны следующие соотношения:
R(n) = R(n – 1) + R(n : 2) (если n чётно).
R(1) = 1;
R(2) = R(1) + R(1) = 2;
R(3) = R(2) = 2;
R(4) = R(3) + R(2) = 2 + 2 = 4;
R(5) = R(4) = 4;
R(6) = R(5) + R(3) = 4 + 2 = 6;
R(7) = R(6) = 6;
R(8) = R(7) + R(4) = 6 + 4 = 10;
R(9) = R(8) = 10;
R(10) = R(9) + R(5) = 10 + 4 = 14.
F(10) = 1;
F(11) = F(10) = 1;
F(12) = F(11) = 1;
F(13) = F(12) = 1;
F(14) = F(13) = 1;
F(15) = F(14) = 1;
F(15) = F(14) = 1;
F(16) = F(15) = 1;
F(17) = F(16) = 1;
F(18) = F(17) = 1;
F(19) = F(18) = 1;
F(20) = F(19) + F(10) = 2.
Таким образом, количество программ, удовлетворяющих условию задачи, равно 14 · 2 = 28.
Решение. Для решения данной задачи будем посимвольно считывать текстовый файл. Объявим переменные c1 и c2, которые будут хранить предыдущий символ в файле и текущий. Также объявим переменные k и max. Первая нужна для определения длины каждой последовательности символов, среди которых нет идущих подряд символов P, вторая — для хранения максимальной длины такой последовательности. Алгоритм будет сравнивать значение текущего символа со значением предыдущего и, если не будут встречены два подряд идущих символа P, увеличивать значения счётчика kна 1.
Приведём решение данной задачи на языке Pascal.
var k, max: integer;
c1, c2: char;
f: text;
begin
assign(f,'C:\24.txt');
reset(f);
c1 := '0';
c2 := '0';
k := 1;
max := 0;
while not Eof(f) do begin
c2 := c1;
read(f, c1);
if (c1 = c2) and (c2 = 'P') then begin
if k > max then max := k;
k := 1;
end
else k := k + 1;
end;
if k > max then
max := k;
writeln(max);
end.
В результате работы данного алгоритма при вводе данных из файла в условии получаем ответ — 188.
Ответ: 188.
Примечание. Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём решение Витаса Ремейкиса на языке Python.
file = open('24.txt', 'r')
st = file.readline()
k = 1
mx = 0
for i in range(1, len(st)):
if st[i] == 'P' and st[i-1] == 'P':
k = 1
else:
k += 1
if k > mx:
mx = k
print(mx)
Приведём решение Ивана Каримова на языке Python.
import re
s = open('24.txt').readline()
print(max(map(len, re.split(r'P{2,}', s)))+2)
Приведём решение Ильи Андрианова на языке Python.
s = open('24.txt').readline()
while 'PP' in s:
s = s.replace('PP', 'P P')
print(max([len(x) for x in s.split()]))
Приведём решение Ивана Новикова на языке Python.
Пусть M — сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то значение M считается равным нулю.
Напишите программу, которая перебирает целые числа, бо́льшие 700 000, в порядке возрастания и ищет среди них такие, для которых значение M оканчивается на 8. Выведите первые пять найденных чисел и соответствующие им значения M.
Формат вывода: для каждого из пяти таких найденных чисел в отдельной строке сначала выводится само число, затем — значение М.
Строки выводятся в порядке возрастания найденных чисел.
Количество строк в таблице для ответа избыточно.
Ответ:
Решение. Заметим, что у каждого числа делители парные, например, у числа 8 это 1 и 8,2 и 4. Будем находить первый натуральный делитель числа, отличный от единицы, и проверять, делится ли сумма найденного делителя с его парным делителем на 10с остатком 8. Если условие выполняется — выводим исходное число и сумму его парных минимального и максимального делителей на экран и выходим из цикла для перебора делителей числа, иначе сразу выходим из цикла для перебора делителей числа.
Приведём решение на языке Pascal.
var
count, j, k, sqrtI, num: longint;
begin
num := 700000;
count := 0;
while True do begin
sqrtI := round(sqrt(num));
for j := 2 to sqrtI do begin
if num mod j = 0 then begin
if (j + num div j) mod 10 = 8 then begin
count := count + 1;
writeln(num, ' ', j + num div j);
break;
end
else break;
end;
end;
if count = 5 then break;
num := num + 1;
end;
end.
В результате работы программа должна вывести следующее:
700005 233338
700007 100008
700012 350008
700015 140008
700031 24168
Приведём решение Виктора Кима на языке Python.
count = 0
num = 700000
while count < 5:
num += 1
mx = 0
mn = num + 1
for i in range(2,int(num // 2)+1):
if num % i == 0:
mx = max(mx,i)
mn = min(mn,i)
M = mn + mx
if (M != num + 1) and (M % 10 == 8):
print(num, M)
count += 1
Приведём другое решение Мамаева Романа на языке Python.
Обработка целочисленной информации. Задания для подготовки
i
Системный администратор раз в неделю создаёт архив пользовательских файлов. Однако объём диска, куда он помещает архив, может быть меньше, чем суммарный объём архивируемых файлов. Известно, какой объём занимает файл каждого пользователя.
По заданной информации об объёме файлов пользователей и свободном объёме на архивном диске определите максимальное число пользователей, чьи файлы можно сохранить в архиве, а также максимальный размер имеющегося файла, который может быть сохранён в архиве, при условии, что сохранены файлы максимально возможного числа пользователей.
В первой строке входного файла находятся два числа: S — размер свободного места на диске (натуральное число, не превышающее 10 000) и N — количество пользователей (натуральное число, не превышающее 1000). В следующих N строках находятся значения объёмов файлов каждого пользователя (все числа натуральные, не превышающие 100), каждое в отдельной строке.
Запишите в ответе два числа: сначала наибольшее число пользователей, чьи файлы могут быть помещены в архив, затем максимальный размер имеющегося файла, который может быть сохранён в архиве, при условии, что сохранены файлы максимально возможного числа пользователей.
Пример входного файла:
100 4
80
30
50
40
При таких исходных данных можно сохранить файлы максимум двух пользователей. Возможные объёмы этих двух файлов — 30 и 40,30 и 50 или 40 и 50. Наибольший объём файла из перечисленных пар — 50, поэтому ответ для приведённого примера:
2 50
Ответ:
Решение. Приведём решение на языке Python.
f = open('26_demo.txt')
data = f.readlines()
s = data[0].split()
s = int(s[0])
del (data[0]) # первая строка больше не нужна, удаляем ее
for i in range(0, len(data)):
data[i] = int(data[i])
data = sorted(data)
summa = 0
for count in range(0, len(data)):
if summa + data[count] > s: break
summa += data[count]
print(count)
zapas = s - summa
for i in range(0, len(data)):
if data[i] - data[count - 1] <= zapas:
itog = data[i]
print(itog)
Ответ: 568 50.
Примечание. Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём решение Ильи Крылова на языке Python.
s = [i for i in open('26_demo.txt').readlines()]
size = int(s[0].split()[0])
files = [int(i) for i in s[1:]]
selectedFiles = []
files = sorted(files) # Список файлов отсортирован от меньших значений к большим значениям
while (size - sum(selectedFiles)) >= files[0]:
selectedFiles.append(files[0])
files = files[1:] # Удаляем из списка файлов выбранный файл
lastFileMaxSize = size - sum(selectedFiles[:-1])
biggestPossibleLastFile = max([file for file in files if file <= lastFileMaxSize])
Приведём решение Юрия Красильникова на языке Python.
f = open('26_demo.txt')
s,n = list(map(int,f.readline().split()))
files = sorted([int(line) for line in f])
filessum = [files[0]]
for x in files[1:]: filessum.append(filessum[-1]+x)
ndx = max([i for i in range(len(filessum)) if filessum[i] <= s])
freespace = s-filessum[ndx-1]
maxfile = max([x for x in files if x <= freespace])
print(ndx+1,maxfile)
Приведём другое решение.
Сначала считаем в массив данные из файла. После этого отсортируем массив в порядке возрастания. Таким образом, последовательно складывая элементы массива с начала и сравнивая сумму с размером свободного места на диске, получим максимальное количество пользователей, чьи файлы могут поместиться на диске. Далее, вычитая из найденной суммы наибольший файл в текущей последовательности, будем пробовать прибавлять файлы с большим весом. Если такой файл будет найден, то заменяем значение наибольшего файла, который возможно поместить на диск.
Приведём решение на языке Pascal.
var
i, j, t: integer;
a: array [1..1000] of integer;
s: integer;
n: integer;
sum: integer;
maxi: integer;
f: text;
begin
assign(f,'C:\26.txt');
reset(f);
readln(f, s, n);
for i := 1 to n do readln(f, a[i]);
for i := 1 to n do
for j := i + 1 to n do
if a[i] > a[j] then begin
t := a[i];
a[i] := a[j];
a[j] := t;
end;
sum := 0;
maxi := 1;
for i := 1 to n do
if sum + a[i] <= s then begin
sum := sum + a[i];
maxi := i;
end;
t := a[maxi];
for i := maxi to n do
if ((sum - t) + a[i]) <= s then begin
sum := sum - t + a[i];
t := a[i];
end;
writeln(maxi, ' ', t);
end.
В результате работы данного алгоритма при вводе данных из файла в условии получаем ответ — 568 50.
Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 43. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.
Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 10 000 000). Каждая из следующих N строк содержит одно натуральное число, не превышающее 10 000.
Пример организации исходных данных во входном файле:
14
1
2
1
4
93
8
5
95
6
4
3
2
8
6 В ответе укажите два числа: сначала значение искомой длины для файла А, затем — для файла B. Для приведенного примера ответ — 7.
Предупреждение: для обработки файла B не следует использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго.
Решение. Приведём решение на языке Python.
f = open("27_B.txt")
n = int(f.readline())
mins = [1000000001 for i in range(43)]
minl = [0 for i in range(43)]
sum = 0
maxsum = 0
minlen = 0
ms = 0
l = 0
for i in range(1, n + 1):
num = int(f.readline())
sum = sum + num
d = sum % 43
if d == 0:
maxsum = sum
minlen = i
else:
ms = sum - mins[d]
l = i - minl[d]
if ms > maxsum:
maxsum = ms
minlen = l
if (ms == maxsum) and (l < minlen):
maxsum = ms
minlen = l
if sum < mins[d]:
mins[d] = sum
minl[d] = i
print(minlen)
Ответ: 185 329329.
Приведём решение Матвея Курченко на языке Python.
if a[i][0] != 1e9 and a[i][1] != -1 and a[i][1] != a[i][0]:
s = pr[a[i][1]+1] - pr[a[i][0]+1]
if s > mx:
mx = s
ln = a[i][1] - a[i][0]
if s == mx and a[i][1] - a[i][0] < ln:
ln = a[i][1] - a[i][0]
print(ln)
Приведём решение Юрия Красильникова на языке Python.
a = [int(s) for s in open('27_B.txt')][1:]
p = 0
b = [0]
nk = [[0]] + [[] for _ in range(42)]
for i in range(len(a)):
p += a[i]
b.append(p)
r = p%43
if len(nk[r]) < 2: nk[r].append(i+1)
else: nk[r][1] = i+1
r = sorted([(b[x[1]]-b[x[0]],x[0]-x[1]) for x in nk if len(x) == 2],reverse=True)
print(-r[0][1])
Приведем другое решение.
Будем последовательно считывать числа из файла, суммируя все полученные числа. В массиве mins будем накапливать суммы с остатками от 0 до 42,в массиве minl будем накапливать длины для этих сумм. Каждую итерацию цикла будем проверять, делится ли текущая сумма на 43 без остатка. Если текущая сумма делится на 43 с определённым остатком, будем вычитать из неё сумму с таким же остатком из массива mins и записывать полученное значение в переменную maxsum (если полученная сумма будет больше текущего значения переменной), то же самое будем проделывать для минимальной длины последовательности.
Приведём решение задачи на языке Pascal.
var
i, d: longint;
n: longint;
mins: array [1..42] of longint;
minl: array [1..42] of longint;
sum, maxsum, minlen, num, ms, l: longint;
f: text;
begin
assign(f,'C:\27_A.txt');
reset(f);
readln(f, n);
for i := 1 to 42 do mins[i] := 1000000001;
for i := 1 to 42 do minl[i] := 0;
sum := 0;
maxsum := 0;
minlen := 0;
ms := 0;
l := 0;
for i := 1 to n do begin
readln(f, num);
sum := sum + num;
d := sum mod 43;
if d = 0 then begin
maxsum := sum;
minlen := i;
end
else begin
ms := sum - mins[d];
l := i - minl[d];
if ms > maxsum then begin
maxsum := ms;
minlen := l;
end;
if (ms = maxsum) and (l < minlen) then begin
maxsum := ms;
minlen := l;
end;
if sum < mins[d] then begin
mins[d] := sum;
minl[d] := i;
end;
end;
end;
writeln(minlen);
end.
В результате работы данного алгоритма при вводе данных из файла A ответ — 185, из файла B — 329329.