Блог пользователя isaf27

Автор isaf27, история, 8 лет назад, По-русски

Здравствуйте.

Как известно, на данный момент существует два распространённых вида олимпиадных задач — стандартная и интерактивная.

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

Как мне кажется, было бы интересно делать такие задачи и по программированию. На простом примере разберем как это можно сделать. Следующая задача: зритель загадывает последовательность из 10 цифр, после чего помощник должен закрыть одну из цифр. Далее фокусник, видя последовательность с одной закрытой цифрой, должен отгадать, какую цифру закрыли. Решение очень простое: пусть помощник, увидев последовательность a0, a1, ..., a9, закроет цифру под номером . Фокусник видя номер закрытой цифры и сумму всех, кроме неё, может вычесть из номера эту сумму по модулю 10 и получить цифру, которая закрыта. Теперь участнику предлагается написать решение следующим образом: сначала ему будет вводиться число 0 или 1. Если число 0, то это будет означать, что его программа выступает в роли помощника в данный момент, 1 если в роли фокусника. После строка длины 10 — сама последовательность. Если первое число 0, то она будет состоять только из цифр, если первое число 1, то закрытый символ будет 'x', например. И тогда, если программа — помощник, нужно вывести номер закрываемой цифры, если фокусник, то назвать загаданную цифру. Чтобы проверить решение нужно будет запустить решение участника с вводом 0 + последовательность, далее считать номер закрытой цифры и ещё раз запустить решение участника с вводом 1 + последовательность с одной закрытой цифрой и сверить ответ участника с правильным. Отличие от обычных задач — то, что требуется запустить программу участника два раза при проверке на одном тесте.

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

Спасибо за внимание. Буду рад услышать ваши мнения и идеи по этому поводу.

  • Проголосовать: нравится
  • +108
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится +24 Проголосовать: не нравится

Хорошая идея! Было бы интересно хотя бы попробовать

»
8 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

Вот похожая задача: http://codeforces.net/gym/101193/problem/I

Здесь тоже две роли и решение нужно придумать для каждой)

»
8 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

Немного похожая задача 690A3 - Коллективный разум (сложная). Нужно придумать стратегия для n человек.

»
8 лет назад, # |
  Проголосовать: нравится +23 Проголосовать: не нравится
  • »
    »
    8 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

    Эх, немного опередил, но я большой текст написал зато)

»
8 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится

На IOI часто бывают необычные задачи. Например, задача с IOI 2011 Parrots. В ней нужно реализовать две функции, одна — принимает данные и кодирует их особым образом для передачи через специфичный канал связи, вторая — получает данные, переданные через этот канал связи от первой функции, должна их декодировать и получить исходные данные.

Появлению таких задач на IOI во многом способствует то, что от участников требуется написать не стандартную программу, считывающую из stdin и выводящую в stdout, а реализовать некоторые функции, описанные в условии и в хедере.