Здравствуйте.
Как известно, на данный момент существует два распространённых вида олимпиадных задач — стандартная и интерактивная.
Недавно, решая задачи по математике, я наткнулся на задачу следующего вида — ставится фокус с участием зрителя, фокусника и его помощника. Cначала зритель загадывает некоторый объект, который определен в условии задачи (последовательность чисел, строка и тд). После этого помощник как-то его изменяет, что тоже определено в условии. После этого входит фокусник и, по тому что он видит, угадывает то, что загадал зритель. Конечно помощник и фокусник договариваются о том, как помощнику изменить объект, чтобы потом фокусник мог его отгадать. Чаще всего суть задачи состоит в том, чтобы понять, как им договориться.
Как мне кажется, было бы интересно делать такие задачи и по программированию. На простом примере разберем как это можно сделать. Следующая задача: зритель загадывает последовательность из 10 цифр, после чего помощник должен закрыть одну из цифр. Далее фокусник, видя последовательность с одной закрытой цифрой, должен отгадать, какую цифру закрыли. Решение очень простое: пусть помощник, увидев последовательность a0, a1, ..., a9, закроет цифру под номером . Фокусник видя номер закрытой цифры и сумму всех, кроме неё, может вычесть из номера эту сумму по модулю 10 и получить цифру, которая закрыта. Теперь участнику предлагается написать решение следующим образом: сначала ему будет вводиться число 0 или 1. Если число 0, то это будет означать, что его программа выступает в роли помощника в данный момент, 1 если в роли фокусника. После строка длины 10 — сама последовательность. Если первое число 0, то она будет состоять только из цифр, если первое число 1, то закрытый символ будет 'x', например. И тогда, если программа — помощник, нужно вывести номер закрываемой цифры, если фокусник, то назвать загаданную цифру. Чтобы проверить решение нужно будет запустить решение участника с вводом 0 + последовательность, далее считать номер закрытой цифры и ещё раз запустить решение участника с вводом 1 + последовательность с одной закрытой цифрой и сверить ответ участника с правильным. Отличие от обычных задач — то, что требуется запустить программу участника два раза при проверке на одном тесте.
Хороших задач по математике такого и похожего типа достаточно много. Мне кажется, что это интересная идея, хотя и очень непросто реализуемая. Было бы круто, если этот или другой вид задач начал развиваться, как это было с интерактивными задачами.
Спасибо за внимание. Буду рад услышать ваши мнения и идеи по этому поводу.
Хорошая идея! Было бы интересно хотя бы попробовать
Вот похожая задача: http://mirror.codeforces.com/gym/101193/problem/I
Здесь тоже две роли и решение нужно придумать для каждой)
Немного похожая задача 690A3 - Коллективный разум (сложная). Нужно придумать стратегия для n человек.
http://www.ioi2011.or.th/hsc/tasks/EN/parrots.pdf
Эх, немного опередил, но я большой текст написал зато)
На IOI часто бывают необычные задачи. Например, задача с IOI 2011 Parrots. В ней нужно реализовать две функции, одна — принимает данные и кодирует их особым образом для передачи через специфичный канал связи, вторая — получает данные, переданные через этот канал связи от первой функции, должна их декодировать и получить исходные данные.
Появлению таких задач на IOI во многом способствует то, что от участников требуется написать не стандартную программу, считывающую из stdin и выводящую в stdout, а реализовать некоторые функции, описанные в условии и в хедере.