игры

6 задач
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.

Беси и Эльза играют в игру с кучей камней. Изначально в ней \(S\) камней (\(1\le S<10^{10^5}\)). Коровы делают ходы по очереди, Беси начинает. В свой ход корова должна убрать из кучи \(x\) камней, где \(x\) - любое положительное целое число, которое является палиндромом. Если ход коровы, а куча пуста, эта корова проиграла.

Определение: Положительное целое число является палиндромом, если оно читается одинаково от начала к концу и от конца к началу, например 1, 121, 9009. Лидирующие нули нельзя опускать. Поэтому 990 не палиндром.

Всего имеется \(T\) (\(1\le T\le 10\)) независимых подтестов в каждом тесте. Для каждого подтеста выведите имя коровы, которая победит, если обе играют оптимально.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Первая строка содержит \(T\), количество подтестов. Следующие \(T\) строк описывают подтесты, по одной строке на каждый подтест.

Каждый подтест содержит одно целое число \(S\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Для каждого подтеста на отдельной строке выведите B, если выиграет Беси, E - Эльза - при оптимальной игре обоих игроков.

Cake Game#90245

Беси и Эльза нашли ряд из \(N\) пирожных \((2 \leq N \leq 5\cdot 10^5, N \text{ четное})\), с размерами \(a_1,a_2,\dots,a_N\) в таком порядке (\(1\le a_i\le 10^9\)).

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

  1. Беси выбирает два соседних пирожных и ставит одно из них на другое, создавая новое пирожное, размером равным сумме размеров этих пирожных.
  2. Эльза выбирает либо самое левое пирожное, либо самое правое пирожное и кладёт себе в тайник.

Когда остаётся только одно пирожное Беси съедает его, а Эльза съедает все пирожные из своего тайника. Если обе коровы играют оптимально, и Беси начинает первой, сколько пирожных съест каждая корова?

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Каждый ввод состоит \(T\) (\(1\le T\le 10\)) независимых подтестов. Гарантируется, что сумма всех \(N\) на вводе не превысит \(10^6\).

Каждый подтест сформатирован следующим образом. Первая строка содержит \(N\). Следующая строка содержит \(N\) разделённых одиночными пробелами целых чисел \(a_1,a_2,\ldots,a_N\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Для каждого подтеста выведите строку, содержащую \(b\) и \(e\), представляющие количества пирожных, которые съедят Беси и Эльза, если обе коровы играют оптимально.

Фермеры Джон и Нхой играют в игру в круглом амбаре. В этом амбаре имеется \(N\) (\(1 \leq N \leq 10^5\)) комнат, \(i\)-ая комната изначально содержит \(a_i\) коров (\(1 \leq a_i \leq 5\cdot 10^6\)). Игра такова:

    Оба фермера всегда находятся в одной и той же комнате. После входа в комнату каждый фермер делает ровно один ход. ФД ходит первым. Об фермера изначально входят в комнату \(1\).
  • Если в комнате 0 коров, то фермер проиграл, иначе фермер выбирает целое число \(P\), где \(P\) должно быть или \(1\), или простое число, не более чем количество коров в амбаре и удаляет \(P\) коров из текущей комнаты.
  • После того, как оба фермера сделали ход, оба фермера переходят в следующую комнату по кругу. То есть, если фермеры находятся в комнате \(i\), они перемещаются в комнату \(i+1\), а из комнаты \(N\) они перемещаются в комнату \(1\).

Определите фермера, который выиграет в этой игре, если оба играют оптимально.

ФОРМАТ ВВОДА (с клавиатуры / stdin):

Ввод содержит \(T\) подтестов. Первая строка содержит \(T\) (\(1 \leq T \leq 1000\)). Далее следуют \(T\) подтестов.

каждый подтест начинается со строки, содержащей \(N\), за которой следует строка, содержащая числа \(a_1,\dots,a_N\).

Гарантируется, что сумма всех \(N\) не более \(2\cdot 10^5\).

ФОРМАТ ВЫВОДА (на экран / stdout):

Для каждого подтеста выведите кто выиграет игру то есть "Farmer John" или "Farmer Nhoj."

Вы можете предполагать, что суммарное время работы библиотеки в процессе тестирования не будет превышать 4 сек.

Загрузить библиотеку для тестирования

Рассмотрим игру для двух игроков. Игрокам дан прямоугольник размером x × y (где x и y — положительные целые числа). Игроки ходят по очереди. Ход состоит в разделении прямоугольника на два прямоугольника одним горизонтальным или вертикальным разрезом. Полученные прямоугольники должны иметь положительные целочисленные размеры.


                  Возможные разрезы прямоугольника размером 4 × 3.

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

Ваша задача — написать программу, которая бы играла в игру с прямоугольниками и выигрывала. Для того чтобы играть, программа должна использовать специальную библиотеку. В библиотеке есть функции dimension_x() и dimension_y(), возвращающие размеры прямоугольника. Начальные размеры прямоугольника — целые числа от 1 до 100 000 000. Как минимум один из размеров больше 1. К тому же, в 50% тестов размеры прямоугольника не будут превышать 25.

В библиотеке есть также процедура cut(dir, position), которая должна вызываться вашей программой, чтобы сделать ход. Параметры dir и position описывают направление и позицию разреза соответственно. Параметр dir может принимать одно из двух значений: vertical и horizontal. Если dir = vertical, то проводится вертикальный разрез, а параметр position указывает x - координату разреза, как показано на рисунке выше. При этом вы должны гарантировать выполнение неравенства 1 ≤ position  ≤ dimension_x()− 1. Если dir = horizontal, то проводится горизонтальный разрез, а параметр position указывает y ? координату разреза. При этом, вы должны гарантировать выполнение неравенства 1 ≤ position  ≤ dimension_y()− 1.

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

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

Экспериментирование

Для того, чтобы дать вам возможность поэкспериментировать с библиотекой, в ваше распоряжение предоставлены примеры библиотек: их исходные тексты находятся в файлах preclib.pas, creclib.c и creclib.h . Эти библиотеки вы можете взять по адресу: http :// contest / . Они реализуют очень простую стратегию. Когда вы запустите вашу программу, она будет играть против этих простых соперников. Вы можете изменять их, чтобы протестировать вашу программу с лучшими соперниками. Следует учесть, что во время тестирования после окончания тура, ваша программа будет играть против другого соперника.

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

Если вы модифицируете часть implementation библиотеки preclib.pas, пожалуйста, перекомпилируйте её, используя команду ppc386 -O2 preclib.pas. Эта команда создаст файлы preclib.o и preclib.ppu. Эти файлы необходимы для компиляции вашей программы и должны быть в помещены в каталог, где находится ваша программа. Пожалуйста, не модифицируйте часть interface библиотеки preclib.pas.

Если вы модифицируете библиотеку creclib.c, пожалуйста, не забудьте поместить ее вместе с creclib.h в каталог, где находится ваша программа, — они необходимы для компиляции. Пожалуйста, не модифицируйте файл creclib.h.

В ваше распоряжение также предоставляются две простые программы, которые иллюстрируют использование библиотек crec.c и prec.pas. Пожалуйста, помните, что эти программы не являются правильными решениями. Вы можете откомпилировать их, используя такие команды:

gcc -O2 -static crec.c creclib.c -lm
g++ -O2 -static crec.c creclib.c -lm
ppc386 -O2 -XS prec.pas

Библиотеки

В ваше распоряжение предоставлены библиотеки, которые обеспечивают следующую функциональность:

Библиотека для FreePascal (preclib.ppu, preclib.o)
type direction = (vertical, horizontal);
function dimension_x(): longint;
function dimension_y(): longint;
procedure cut(dir: direction; position: longint);

 
Включите следующий оператор в ваш исходный файл rec.pas:
uses preclib;
Чтобы откомпилировать вашу программу, скопируйте файлы preclib.o и reclib.ppu в каталог, где находится ваш исходный файл, и выполните следующую команду:
ppc386 -O2 -XS rec.pas
Файл prec.pas является примером использования библиотеки preclib.

Библиотека для GNU C/C++ (creclib.h, creclib.c)

typedef enum __direction {vertical, horizontal} direction;
int dimension_x();
int dimension_y();
void cut(direction dir, int position);



Включите следующий оператор в ваш исходный файл (rec.c или rec.cpp):
#include ”creclib.h”
Чтобы откомпилировать вашу программу, скопируйте файлы creclib.c и creclib.h в каталог, где находится ваш исходный файл, и выполните следующую команду:
gcc -O2 -static rec.c creclib.c –lm
или:
g++ -O2 -static rec.cpp creclib.c –lm
Файл crec.c является примером использования библиотеки в C.
Пример взаимодействия

Ниже приведен пример взаимодействия вашей программы с библиотекой. Он показывает, как может проходить игра. Игра начинается с прямоугольника размером 4 × 3. Существует выигрышная стратегия для этого случая.
 

Ваша программа вызывает

Что происходит

dimension_x()

возвращает 4

dimension_y()

возвращает 3

cut(vertical, 1)

ваш разрез записывается, и прямоугольник размером 3 × 3 передается вашему сопернику, который разрезает его и получается прямоугольник размером 3 × 2; после этого управление передается вашей программе

dimension_x()

возвращает 3

dimension_y()

возвращает 2

cut(horizontal, 1)

ваш разрез записывается, и прямоугольник размером 3 × 1 передается вашему сопернику, который разрезает его и получается прямоугольник размером 2 × 1; после этого управление передается вашей программе

dimension_x()

возвращает 2

dimension_y()

возвращает 1

cut(vertical, 1)

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

Два участника олимпиады играют в следующую игру. Участники по очереди бросают монетки (одну или больше) в хитрый ящик. Если в ящике находится в точности X1, или X2, ..., или Xn монеток, то они, кроме одной, отдаются участнику, сделавшему последний ход. Оставшаяся монетка "исчезает" из игры. Игра заканчивается, если у одного из участников игры не осталось монеток. При этом монетки из ящика (все до одной) отдаются другому участнику(он является победителем игры). Определить наибольшее количество монеток, которое может выиграть первый участник при наилучшей игре второго. Если первый участник не может выиграть, то результатом является число 0.

Входные данные
В первой строке входного файла два числа 0 < S,T <= 50 (число монеток у первого и второго игроков). Во второй строке N (0 <= N <= 50) - число хитрых состояний ящика. В третьей строке целые числа X1, X2,..., Xn, 0 < X1 <= X2 <= ... <= Xn <= 100.

Выходные данные
Вывести число монеток у первого участника или 0.
{ "X":110, "Z":110, "Step":10, "PlayerPoint": {"pointX" : -10, "pointZ" : -10, "angle" : 90}, "WallPoints": [ { "pointX" : 15, "pointZ" : -10, "angle" : 90}, { "pointX" : 15, "pointZ" : 0, "angle" : 90}, { "pointX" : 15, "pointZ" : 10, "angle" : 90}, { "pointX" : 15, "pointZ" : 20, "angle" : 90}, { "pointX" : 15, "pointZ" : 30, "angle" : 90}, { "pointX" : -20, "pointZ" : 35, "angle" : 0}, { "pointX" : -10, "pointZ" : 35, "angle" : 0}, { "pointX" : 0, "pointZ" : 35, "angle" : 0}, { "pointX" : 10, "pointZ" : 35, "angle" : 0} ], "HolePoints": [ { "pointX" : -20, "pointZ" : -30, "angle" : 0}, { "pointX" : -30, "pointZ" : -30, "angle" : 0}, { "pointX" : -40, "pointZ" : -30, "angle" : 0}, { "pointX" : -40, "pointZ" : -40, "angle" : 0}, ], "PrizePoints": [ { "pointX" : -30, "pointZ" : -40, "angle" : 0}, { "pointX" : 30, "pointZ" : 30, "angle" : 0} ] }
Поделиться
Класснуть