|
Задание 1. Для каждой из начальных позиций (6, 33), (8, 32) укажите, кто из игроков имеет выигрышную стратегию. В каждом случае опишите выигрышную стратегию; объясните, почему эта стратегия ведёт к выигрышу, и укажите, какое наибольшее количество ходов может потребоваться победителю для выигрыша при этой стратегии.
Задание 2. Для каждой из начальных позиций (6, 32), (7, 32), (8, 31) укажите, кто из игроков имеет выигрышную стратегию. В каждом случае опишите выигрышную стратегию; объясните, почему эта стратегия ведёт к выигрышу, и укажите, какое наибольшее количество ходов может потребоваться победителю для выигрыша при этой стратегии.
Задание 3. Для начальной позиции (7, 31) укажите, кто из игроков имеет выигрышную стратегию. Опишите выигрышную стратегию; объясните, почему эта стратегия ведёт к выигрышу, и укажите, какое наибольшее количество ходов может потребоваться победителю для выигрыша при этой стратегии. Постройте дерево всех партий, возможных при указанной Вами выигрышной стратегии. Представьте дерево в виде рисунка или таблицы.
Пояснение.
| Положение после очередных ходов
| Исходное положение
| 1-й ход Пети (разобраны все ходы, указанна полученная позиция)
| 1-й ход Вани (только ход по стратегии, указана полученная позиция)
| 2-й ход Пети (разобраны все ходы, указана полученная позиция)
| 2-й ход Вани (только ход по стратегии, указана полученная позиция)
| (7,31)
Всего 38
| (7,31+1)=(7,32)
Всего 39
| (7+1,32)=(8,32)
Всего 40
| (8+1,32)=(9,32)
Всего 41
| (9,32*2)=(9,64)
Всего 73
| (8,32+1)=(8,33)
Всего 41
| (8,33*2)=(8,66)
Всего 74
| (8*2,32)=(16,32)
Всего 48
| (16,32*2)=(16,64)
Всего80
| (8,32*2)=(8,64)
Всего 72
| (8,64*2)=(8,128)
Всего 136
| (7+1,31)=(8,31)
Всего 39
| (8,31+1)=(8,32)
Всего 40
| (8+1,32)=(9,32)
Всего 41
| (9,32*2)=(9,64)
Всего 73
| (8,32+1)=(8,33)
Всего41
| (8,33*2)=(8,66)
Всего 74
| (8*2,32)=(16,32)
Всего 48
| (16,32*2)=(16,64)
Всего 80
| (8,32*2)=(8,64)
Всего 72
| (8,64*2)=(8,128)
Всего 136
| (7*2,31)=(14,31)
Всего 45
| (14,31*2)=(14,62)
Всего 76
|
|
| (7,31*2)=(7,62)
Всего 69
| (7,62*2)=(7,124)
Всего 131
|
|
|
Задание 1. В начальных позициях (6, 33), (8, 32) выигрышная стратегия есть у Вани. При начальной позиции (6, 33) после первого хода Пети может получиться одна из следующих четырёх позиций: (7, 33), (12, 33), (6, 34), (6, 66). Каждая из этих позиций содержит менее 73 камней. При этом из любой из этих позиций Ваня может получить позицию, содержащую не менее 73 камней, удвоив количество камней во второй куче. Для позиции (8, 32) после первого хода Пети может получиться одна из следующих четырёх позиций: (9, 32), (16, 32), (8, 33), (8, 64). Каждая из этих позиций содержит менее 73 камней. При этом из любой из этих позиций Ваня может получить позицию, содержащую не менее 73 камней, удвоив количество камней во второй куче. Таким образом, Ваня при любом ходе Пети
выигрывает своим первым ходом.
Задание 2. В начальных позициях (6, 32), (7, 32) и (8, 31) выигрышная стратегия есть у Пети. При начальной позиции (6, 32) он должен первым ходом получить позицию (6, 33), из начальных позиций (7, 32) и (8, 31). Петя после первого хода должен получить позицию (8, 32). Позиции (6, 33) и (8, 32) рассмотрены при разборе задания 1. В этих позициях выигрышная стратегия есть у игрока, который будет ходить вторым (теперь это Петя). Эта стратегия описана при разборе задания 1. Таким образом, Петя при любой игре Вани выигрывает своим вторым ходом.
Задание 3. В начальной позиции (7, 31) выигрышная стратегия есть у Вани. После первого хода Пети может возникнуть одна из четырёх позиций: (8, 31), (7, 32), (14, 31) и (7, 62). В позициях (14, 31) и (7, 62) Ваня может выиграть одним ходом, удвоив количество камней во второй куче. Позиции (8, 31) и (7, 32) были рассмотрены при разборе задания 2. В этих позициях у игрока, который должен сделать ход (теперь это Ваня), есть выигрышная стратегия. Эта стратегия описана при разборе задания 2. Таким образом, в зависимости от игры Пети Ваня выигрывает на первом или втором ходу.
27. Задание В физической лаборатории проводится долговременный эксперимент по изучению гравитационного поля Земли. По каналу связи каждую минуту в лабораторию передаётся положительное целое число – текущее показание прибора «Сигма 2015». Количество передаваемых чисел в серии известно и не превышает 10 000. Все числа не превышают 1000. Временем, в течение которого происходит передача, можно пренебречь.
Необходимо вычислить «бета-значение» серии показаний прибора – минимальное чётное произведение двух показаний, между моментами передачи которых прошло не менее 6 минут. Если получить такое произведение не удаётся, ответ считается равным –1.
Вам предлагается два задания, связанных с этой задачей: задание А и задание Б. Вы можете решать оба задания или одно из них по своему выбору. Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание – 0 баллов. Задание Б является усложнённым вариантом задания А, оно содержит дополнительные требования к программе.
А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования.
ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ А.
Максимальная оценка за выполнение задания А – 2 балла.
Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).
Программа считается эффективной по времени, если время работы
программы пропорционально количеству полученных показаний прибора N, т.е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.
Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.
Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.
ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ Б.
Максимальная оценка за правильную программу, эффективную по времени и по памяти, – 4 балла.
Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, – 3 балла. НАПОМИНАЕМ! Не забудьте указать, к какому заданию относится каждая из представленных Вами программ.
Входные данные представлены следующим образом. В первой строке задаётся число N – общее количество показаний прибора. Гарантируется, что N > 6. В каждой из следующих N строк задаётся одно положительное целое число – очередное показание прибора.
Пример входных данных:
11
12
45
5
3
17
23
21
20
19
18
17
Программа должна вывести одно число – описанное в условии произведение либо –1, если получить такое произведение не удаётся.
Пример выходных данных для приведённого выше примера входных данных:
54
Пояснение.
Задание Б (решение для задания А приведено ниже, см. программу 4). Чтобы произведение было чётным, хотя бы один сомножитель должен быть чётным, поэтому при поиске подходящих произведений чётные показания прибора можно рассматривать в паре с любыми другими, а нечётные – только с чётными.
Для каждого показания с номером k, начиная с k = 7, рассмотрим все допустимые по условиям задачи пары, в которых данное показание получено вторым. Минимальное произведение из всех этих пар будет получено, если первым в паре будет взято минимальное подходящее показание среди всех, полученных от начала приёма и до показания с номером k – 6. Если очередное показание чётное, минимальное среди предыдущих может быть любым, если нечётное – только чётным.
Для получения эффективного по времени решения нужно по мере ввода данных помнить абсолютное минимальное и минимальное чётное показание на каждый момент времени, каждое вновь полученное показание умножать на соответствующий ему минимум, имевшийся на 6 элементов ранее, и выбрать минимальное из всех таких произведений.
Поскольку каждое текущее минимальное показание используется после ввода ещё 6 элементов и после этого становится ненужным, достаточно хранить только 6 последних минимумов. Для этого можно использовать массив из 6 элементов и циклически заполнять его по мере ввода данных. Размер этого массива не зависит от общего количества введённых показаний, поэтому такое решение будет эффективным не только по времени, но и по памяти. Чтобы хранить абсолютный и чётный минимумы, нужно использовать два таких массива. Ниже приводится пример такой программы, написанной на алгоритмическом языке.
Пример 1. Пример правильной программы на алгоритмическом языке. Программа эффективна и по времени, и по памяти.
алг
нач
цел s = 6 | требуемое расстояние между показаниями
цел amax = 1001 | больше максимально возможного показания
цел N
ввод N
цел a | очередное показание прибора
целтаб мини[0:s-1] | текущие минимумы последних s элементов
целтаб миничет[0:s-1] | чётные минимумы последних s элементов
цел i
| вводим первые s показаний, фиксируем минимумы
цел ма; ма := amax | минимальное показание
цел мчет; мчет := amax | минимальное чётное показание
нц для i от 1 до s
ввод а
ма := imin(ма, a)
если mod(a,2) = 0 то мчет := imin(мчет,a) все
мини[mod(i, s)] := ма
миничет[mod(i, s)] := мчет
кц
цел мп = amax*amax | минимальное значение произведения
цел п
нц для i от s+1 до N
ввод а
если mod(a,2)=0
то п := a * мини[mod(i, s)]
иначе если мчет < amax
то п := a * миничет[mod(i, s)]
иначе п := amax*amax;
все
все
мп := imin(мп, п)
ма := imin(ма, a)
если mod(a,2) = 0 то мчет := imin(мчет,a) все
мини[mod(i, s)] := ма
миничет[mod(i, s)] := мчет
кц
если мп = amax*amax то мп:=-1 все
вывод мп
кон
Возможны и другие реализации. Например, вместо циклического заполнения массива можно каждый раз сдвигать его элементы. В приведённом ниже примере хранятся и сдвигаются не минимумы, а исходные значения. Это требует чуть меньше памяти (достаточно одного массива вместо двух), но по времени решение со сдвигами менее эффективно, чем с циклическим заполнением. Однако время работы остаётся пропорциональным N, поэтому максимальная оценка за такое решение тоже составляет 4 балла.
Программа 2. Пример правильной программы на языке Паскаль.
Программа использует сдвиги, но эффективна по времени и по памяти
const s = 6; {требуемое расстояние между показаниями}
amax = 1001; {больше максимально возможного показания}
var
N: integer;
a: array[1..s] of integer; {хранение s показаний прибора}
a_: integer; {ввод очередного показания}
ma: integer; {минимальное число без s последних}
me: integer; {минимальное чётное число без s последних}
mp: integer; {минимальное значение произведения}
p: integer;
i, j: integer;
begin
readln(N);
{Ввод первых s чисел}
for i:=1 to s do readln(a[i]);
{Ввод остальных значений, поиск минимального произведения}
ma := amax; me := amax;
mp :=amax*amax;
for i := s + 1 to N do begin
readln(a_);
if a[1] < ma then ma := a[1];
if (a[1] mod 2 = 0) and (a[1] < me) then me := a[1];
if a_ mod 2 = 0 then p := a_ * ma
else if me < amax then p := a_ * me
else p := amax* amax;
if (p < mp) then mp := p;
{сдвигаем элементы вспомогательного массива влево}
for j := 1 to s - 1 do
a[j] := a[j + 1];
a[s] := a_
end;
if mp = amax*amax then mp:=-1;
writeln(mp)
end.
Если вместо небольшого массива фиксированного размера (циклического или со сдвигами) хранятся все исходные данные (или все текущие минимумы), программа сохраняет эффективность по времени, но становится неэффективной по памяти, так как требуемая память растёт пропорционально N. Ниже приводится пример такой программы на языке Паскаль. Подобные (и аналогичные по сути) программы оцениваются не выше 3 баллов.
Программа 3. Пример правильной программы на языке Паскаль. Программа эффективна по времени, но неэффективна по памяти
const s = 6; {требуемое расстояние между показаниями}
amax = 1001; {больше максимально возможного показания}
var
N, p, i: integer;
a: array[1..10000] of integer; {все показания прибора}
ma: integer; {минимальное число без s последних}
me: integer; {минимальное чётное число без s последних}
mp: integer; {минимальное значение произведения}
begin
readln(N);
{Ввод всех показаний прибора}
for i:=1 to N do readln(a[i]);
ma := amax;
me := amax;
mp := amax*amax;
for i := s + 1 to N do
begin
if a[i-s] < ma then ma := a[i-s];
if (a[i-s] mod 2 = 0) and (a[i-s] < me) then
me := a[i-s];
if a[i] mod 2 = 0 then p := a[i] * ma
else if me < amax then p := a[i] * me
else p := amax * amax;
if (p < mp) then mp := p
end;
if mp = amax*amax then mp := -1;
writeln(mp)
end.
Возможно также переборное решение, в котором находятся произведения всех возможных пар и из них выбирается минимальное. Ниже (см. программу 4) приведён пример подобного решения. Это (и аналогичные ему) решение неэффективно ни по времени, ни по памяти. Оно является решением задания А, но не является решением задания Б. Оценка за такое решение – 2 балла.
Программа 4. Пример правильной программы на языке Паскаль. Программа неэффективна ни по времени, ни по памяти
const s = 6; {требуемое расстояние между показаниями}
var
N: integer;
a: array[1..10000] of integer; {все показания прибора}
mp: integer; {минимальное значение произведения}
i, j: integer;
begin
readln(N);
{Ввод значений прибора}
for i:=1 to N do
readln(a[i]);
mp := 1000 * 1000 + 1;
for i := 1 to N-s do begin
for j := i+s to N do begin
if (a[i]*a[j] mod 2 = 0) and (a[i]*a[j] < mp)
then mp := a[i]*a[j]
end;
end;
if mp = 1000 * 1000 + 1 then mp := -1;
writeln(mp)
end. |
|
|