Темы --> Информатика --> Язык программирования
    Процедуры и функции(96 задач)
    Массивы(232 задач)
    Типы данных(356 задач)
    Циклы(177 задач)
    Условный оператор (if)(164 задач)
    Python(260 задач)
    Standard Template Library(2 задач)
---> 952 задач <---
Источники
    Личные олимпиады(938 задач)
    Командные олимпиады(684 задач)
Страница: << 157 158 159 160 161 162 163 >> Отображать по:
ограничение по времени на тест
3.0 second;
ограничение по памяти на тест
256 megabytes

На уроке информатики Валерий изучал сжатие данных. Учитель рассказал новый метод, который мы сейчас вам опишем.

Пусть {a1, a2, ..., an} — данная последовательность строк, которую необходимо сжать. Здесь и далее будем считать, что все строки имеют одинаковую длину и состоят только из символов 0 и 1. Определим функцию сжатия:

  • f(пустая последовательность) = пустая строка
  • f(s) = s.
  • f(s1, s2) = наименьшая по длине строка, у которой один из префиксов равен s1, а один из суффиксов равен s2. Например, f(001, 011) = 0011, f(111, 011) = 111011.
  • f(a1, a2, ..., an) = f(f(a1, a2, an - 1), an). Например, f(000, 000, 111) = f(f(000, 000), 111) = f(000, 111) = 000111.

Перед Валерой стоит серьезная задача — разделить данную последовательность {a1, a2, ..., an} на две подпоследовательности {b1, b2, ..., bk} и {c1, c2, ..., cm}, m + k = n, так, чтобы величина S = |f(b1, b2, ..., bk)| + |f(c1, c2, ..., cm)| приняла минимально возможное значение. Здесь |p| обозначает длину строки p.

Обратите внимание, что запрещается менять относительный порядок строк в подпоследовательностях. Разрешается делать одну из подпоследовательностей пустой. Каждый элемент исходной последовательности должен принадлежать ровно одной из получившихся подпоследовательностей. Элементы подпоследовательностей b и c не обязательно должны идти подряд в исходной последовательности a, то есть они могут чередоваться (смотрите примеры 2 и 3).

Помогите Валере найти минимальное возможное значение S.

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

В первой строке входных данных содержится целое число n — количество строк (1 ≤ n ≤ 2·105). Далее в n строках даны элементы последовательности — строки длиной от 1 до 20 символов, состоящие только из символов 0 и 1. На i + 1 строке входных данных находится i-ый член последовательности. Элементы последовательности разделены исключительно символом перевода строки. Гарантируется, что все строки имеют одинаковую длину.

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

Выведите единственное число — минимально возможное значение S.

Примеры тестов
Входные данные
3
01
10
01
Выходные данные
4
Входные данные
4
000
111
110
001
Выходные данные
8
Входные данные
5
10101
01010
11111
01000
10010
Выходные данные
17
Примечание

Подробные ответы к тестам:

  • Оптимальный вариант: сделать одну из подпоследовательностей пустой, а вторую — равной всей данной последовательности. S = |f(01, 10, 01)| = |f(f(01, 10), 01)| = |f(010, 01)| = |0101| = 4.
  • Оптимальный вариант: b = {000, 001}, c = {111, 110}. S = |f(000, 001)| + |f(111, 110)| = |0001| + |1110| = 8.
  • Оптимальный вариант: b = {10101, 01010, 01000}, c = {11111, 10010}. S = |10101000| + |111110010| = 17.

Подзадача 1. N ≤ 10. Решение оценивается в 30 баллов.

Подзадача 2. N ≤ 1 000. Решение оценивается в 30 баллов.

Подзадача 3. Дополнительные ограничения отсутствуют. Решение оценивается в 40 баллов.

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

ограничение по времени на тест
2.0 second;
ограничение по памяти на тест
64 megabytes

Витя изучает новый язык программирования Питон. Пока он только успел изучить арифметические операции и условную инструкцию «if», но он уже полюбил этот язык за красоту и лаконичность синтаксиса.

Отличительной особенностью языка Питон является то, что блоки после инструкций «if» и «else» (а также в циклах «for» и «while», но Витя еще не успел изучить циклы) выделяются не ключевыми словами (например, в языке Паскаль используются слова «begin» и «end») и не скобками (например, в языке C используются фигурные скобки), а величиной отступа от начала строки, то есть количеством пробелов, которые идут в начале строки. Например, в такой программе:


if a < 0:
print("Число a - отрицательное")
a = -a
print("Теперь a - положительное")

если условие «a < 0» будет истинно, то выполнятся две следующие строки «print("Число a - отрицательное")» и «a = -a», а вот следующая строка «print("Теперь a - положительное")» уже находится вне блока условной инструкции «if» и будет выполнена после этой условной инструкции независимо от истинности проверенного условия.

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

Каждой инструкции «if» может соответствовать не более одной инструкции «else». Не допускаются инструкции «else», перед которыми нет инструкции «if». После каждой инструкции «if» и «else» обязательно следует хотя бы одна инструкция с отступом.

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

Правильно (разрешается разный отступ в блоках «if» и «else») Правильно (вложенные условные инструкции) Неправильно (разный отступ в одном блоке) Неправильно (нет блока с отступом после инструкции «if»)
if x > 0:
    print("x > 0")
    print(x)
else:
  print("x < 0")
  print(-x)
print("Bye")
if a > b:
  if a > c:
        print(a)
  else:
      print(c)
else:
      if b > c:
        print(b)
      else:
        print(c)
if x > 0:
        print(x)
    print("x > 0")
if x > 0:
else:
    print(x)

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

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

Во входном файле записан некоторый текст, содержащий не более 100 строк. Длина каждой строки не превосходит 100 символов. Каждая строка состоит из символов, ASCII-коды которых не менее 32 и не более 126.

Строка считается инструкцией «if», если первыми непробельными символами строки является слово «if», после которого идет пробел, а затем — любое число любых символов. Строка считается инструкцией «else», если она содержит только одно слово «else:» (с двоеточием после него) и, возможно, отступ в начале строки.

Любая строка содержит хотя бы один непробельный символ. Последняя строка программы обязательно содержит ровно одно слово «exit()» без пробелов, завершающееся символом конца строки.

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

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

Примеры тестов

Входные данные
a, b, c = map(int, input().split())
if a > b:
    if a > c:
        print(a)
    else:
        print(c)
else:
    if b > c:
      print(b)
    else:
          print(c)
exit()
Выходные данные
0
Входные данные
x = int(input())
if x < 0:
  print("Negative")
    x = -x
else:
    print("Positive")
exit()
Выходные данные
4

Примечание

Online-группа тестов оценивается в 50 баллов. Тесты этой группы не содержат инструкции «else».

Offline-группа тестов оценивается в 50 баллов.

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

ограничение по времени на тест
-1.0 second;
ограничение по памяти на тест
64 megabytes

В этой задаче нужно придумать генератор — однострочное выражение на языке Python, результатом вычисления которого будет двумерный массив (список вложенных списков), заполненный по некоторому правилу.

Например, пусть нужно задать следующий массив (для удобства добавлены дополнительные пробелы между элементами):

0  0  0  0  0  0
0  1  2  3  4  5
0  2  4  6  8 10
0  3  6  9 12 15
0  4  8 12 16 20
 
В этом массиве n = 5 строк, m = 6 столбцов, и элемент в строке i и столбце j вычисляется по формуле: A[i][j] = i * j.

Ответом на это задание будет следующее выражение-генератор:

[[ i * j for j in range(m)] for i in range(n)] Вам нужно создать текстовый файл, записать в его первой строчке заданное выражение (только одно выражение в квадратных скобках, например, достаточно просто скопировать текст, записанный выше) и сдать на проверку данный файл. Не нужно писать инструкции вроде A = [...] или print(...)).

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

Если в задании сказано, что массив — квадратный, то число строк и столбцов в нем равно n, а значение m не определено и использовать его нельзя.

Проверка будет осуществляться при помощи интерпретатора языка Python версии 3, в частности, это означает, что в генераторах нужно использовать функции range, а не xrange.

Заполните массив целыми числами по образцу в виде таблицы умножения.

Пример для \(n = 5, m = 6\)

0  0  0  0  0  0 
0  1  2  3  4  5 
0  2  4  6  8 10
0  3  6  9 12 15
0  4  8 12 16 20

ограничение по времени на тест
-1.0 second;
ограничение по памяти на тест
64 megabytes

В этой задаче нужно придумать генератор — однострочное выражение на языке Python, результатом вычисления которого будет двумерный массив (список вложенных списков), заполненный по некоторому правилу.

Например, пусть нужно задать следующий массив (для удобства добавлены дополнительные пробелы между элементами):

0  0  0  0  0  0
0  1  2  3  4  5
0  2  4  6  8 10
0  3  6  9 12 15
0  4  8 12 16 20
В этом массиве n = 5 строк, m = 6 столбцов, и элемент в строке i и столбце j вычисляется по формуле: A[i][j] = i * j.

Ответом на это задание будет следующее выражение-генератор:

[[ i * j for j in range(m)] for i in range(n)] Вам нужно создать текстовый файл, записать в его первой строчке заданное выражение (только одно выражение в квадратных скобках, например, достаточно просто скопировать текст, записанный выше) и сдать на проверку данный файл. Не нужно писать инструкции вроде A = [...] или print(...)).

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

Если в задании сказано, что массив — квадратный, то число строк и столбцов в нем равно n, а значение m не определено и использовать его нельзя.

Проверка будет осуществляться при помощи интерпретатора языка Python версии 3, в частности, это означает, что в генераторах нужно использовать функции range, а не xrange.

Заполните массив целыми числами по образцу, "пронумеровав" строки.

Пример для \(n = 5, m = 6\)

0 0 0 0 0 0 
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3 
4 4 4 4 4 4

ограничение по времени на тест
-1.0 second;
ограничение по памяти на тест
64 megabytes

В этой задаче нужно придумать генератор — однострочное выражение на языке Python, результатом вычисления которого будет двумерный массив (список вложенных списков), заполненный по некоторому правилу.

Например, пусть нужно задать следующий массив (для удобства добавлены дополнительные пробелы между элементами): 0 0 0 0 0 0 0 1 2 3 4 5 0 2 4 6 8 10 0 3 6 9 12 15 0 4 8 12 16 20 В этом массиве n = 5 строк, m = 6 столбцов, и элемент в строке i и столбце j вычисляется по формуле: A[i][j] = i * j.

Ответом на это задание будет следующее выражение-генератор:

[[ i * j for j in range(m)] for i in range(n)] Вам нужно создать текстовый файл, записать в его первой строчке заданное выражение (только одно выражение в квадратных скобках, например, достаточно просто скопировать текст, записанный выше) и сдать на проверку данный файл. Не нужно писать инструкции вроде A = [...] или print(...)).

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

Если в задании сказано, что массив — квадратный, то число строк и столбцов в нем равно n, а значение m не определено и использовать его нельзя.

Проверка будет осуществляться при помощи интерпретатора языка Python версии 3, в частности, это означает, что в генераторах нужно использовать функции range, а не xrange.

Заполните массив целыми числами по образцу, "пронумеровав" столбцы.

Пример для \(n = 5, m = 6\)

0 1 2 3 4 5 
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5 
0 1 2 3 4 5


Страница: << 157 158 159 160 161 162 163 >> Отображать по:
Выбрано
:
Отменить
|
Добавить в контест