7. Два игрока, Паша и Вася, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Паша. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в три раза и затем добавить в кучу
один камень. Игра завершается в тот момент, когда количество камней в куче становится не менее 34. Победителем считается игрок, сделавший последний ход, то есть первым получивший
кучу, в которой будет 34 или больше камней. В начальный момент в куче было S камней,
1 ≤ S ≤33.
Задание 1. а) Укажите все такие значения числа S, при которых Паша может выиграть в один
ход. Обоснуйте, что найдены все нужные значения S, и укажите выигрывающий ход для каждого
указанного значения S.
б) Укажите такое значение S, при котором Паша не может выиграть за один ход, но при любом
ходе Паши Вася может выиграть своим первым ходом. Опишите выигрышную стратегию Васи.
Задание 2. Укажите все значения S, при которых у Паши есть выигрышная стратегия, причём
Паша не может выиграть за один ход и может выиграть своим вторым ходом независимо от того,
как будет ходить Вася. Для каждого указанного значения S опишите выигрышную стратегию
Паши.
Задание 3. Укажите хотя бы одно значение S, при котором у Васи есть выигрышная стратегия,
позволяющая ему выиграть первым или вторым ходом при любой игре Паши, и у Васи нет
стратегии, которая позволит ему гарантированно выиграть первым ходом. Для указанного
значения S опишите выигрышную стратегию Васи. Постройте дерево всех партий, возможных
при этой выигрышной стратегии Васи (в виде рисунка или таблицы).
//1
Var
a,b,c,max,i:integer;
ca,cb,cc,smax:string;
begin
max:=-1;
readln(ca);
readln(cb);
readln(cc);
for i:=1 to 3 do
begin
if strtoint(ca[i])>max then
begin
smax:=ca;
max:=strtoint(ca[i]);
end;
if strtoint(ca[i])>max then
begin
smax:=cb;
max:=strtoint(ca[i]);
end;
if strtoint(cc[i])>max then
begin
smax:=cc;
max:=strtoint(ca[i]);
end;
end;
writeln(smax);
end.
Пример ввода:
123
456
908
Пример вывода:
908
//2
Var
n,n1:integer;
s:string;
begin
readln(n);
n1:=n;
if (n=11) or (n=12) or (n=13) or (n=14) then s:='лет' else
begin
n:=n mod 10;
case n of
0:s:='лет';
1:s:='год';
2:s:='года';
3:s:='года';
4:s:='года';
5:s:='лет';
6:s:='лет';
7:s:='лет';
8:s:='лет';
9:s:='лет';
end;
end;
writeln('Мне ',n1,' ',s);
end.
Пример ввода:
18
Пример вывода:
Мне 18 лет
5: 001 {1 - 2 - 4 - 5}
50: 0100010 {1 - 2 - 3 - 6 - 12 - 24 - 25 - 50}
99: 010000101 {1 - 2 - 3 - 6 - 12 - 24 - 48 - 49 - 98 - 99}
В данном случае достаточно просто идти с конца. Скажем, если есть число 99, очевидно, последней командой было "прибавить 1". Далее, 98 - может быть получено умножением на 2, и следует выбирать именно эту команду - программа точно не будет превосходить по размеру вариант, где последней операцией является сложение.
Например,
98 - 49 - 48 короче, чем
98 - 97 - 96 - 48