Последовательно заполни трассировочную таблицу: В каждой строке выполняется действие указанное в алгоритме. В данном алгоритме присваивание значения переменной быстрее,
Предположим, что во второй кучке 73 камня (так как если S=<72, то мы получим выигрыш Пети, так как он может уменьшить количество камней во 2 кучке вполовину и выиграть).
Если Петя:
1. Уберёт из 2 кучки половину камней, то Ваня уберёт из 2 кучки 1 камень и уменьшит количество камней во 2 кучке до 36 и выиграет.
2. Уберёт из 2 кучки 1 камень, то Вася уменьшит количество камней во 2 кучке до 36 и так же выиграет.
3. Уберёт из 1 кучки 1 камень, то Вася тоже уберёт из 1 кучки 1 камень, и затем будет повторять ходы Пети, и Пете придётся начать взаимодействовать со 2 кучкой, и проделать с ней 1 или 2 вариант хода.
4. Уберёт из 1 кучки половину камней, Вася должен повторять за ним, пока Петя не начнёт взаимодействие со 2 кучкой и действовать аналогично
НО(относится к 3 и 4 случаям) Вася должен избегать случаев, где в его ходу были бы нечётное количество камней:
например изначально - (12, 73), Петя - (6, 73) и тут Вася должен сделать ход (5, 73), Петя - (4, 73), Вася - (2, 73), Петя - (1, 73), Вася - (0, 73) или
изначально - (12, 73), Петя - (11, 73) и тут Вася должен сделать ход (6, 73), Петя - (3, 73), Вася - (2, 73), Петя - (1, 73), Вася - (0, 73), и получается ответ 73, но если есть нечётное число 73, то есть и четное - 74.
// PascalABC.NET 3.2, сборка 1344 от 22.11.2016 // Внимание! В других версиях работа не гарантируется! begin var a:=ArrRandom(15,-20,20); a.Println; a:=a.Select(x->x.IsOdd?x*3:x div 2).ToArray; a.Println end.
А вот так это же самое обычно делают в школах... const n=15; var a:array[1..n] of integer; i:integer; begin Randomize; for i:=1 to n do begin a[i]:=Random(41)-20; Write(a[i],' ') end; Writeln; for i:=1 to n do begin if a[i] mod 2=0 then a[i]:=a[i] div 2 else a[i]:=a[i]*3; Write(a[i],' ') end; Writeln end.
73 и 74
Объяснение:
Предположим, что во второй кучке 73 камня (так как если S=<72, то мы получим выигрыш Пети, так как он может уменьшить количество камней во 2 кучке вполовину и выиграть).
Если Петя:
1. Уберёт из 2 кучки половину камней, то Ваня уберёт из 2 кучки 1 камень и уменьшит количество камней во 2 кучке до 36 и выиграет.
2. Уберёт из 2 кучки 1 камень, то Вася уменьшит количество камней во 2 кучке до 36 и так же выиграет.
3. Уберёт из 1 кучки 1 камень, то Вася тоже уберёт из 1 кучки 1 камень, и затем будет повторять ходы Пети, и Пете придётся начать взаимодействовать со 2 кучкой, и проделать с ней 1 или 2 вариант хода.
4. Уберёт из 1 кучки половину камней, Вася должен повторять за ним, пока Петя не начнёт взаимодействие со 2 кучкой и действовать аналогично
НО(относится к 3 и 4 случаям) Вася должен избегать случаев, где в его ходу были бы нечётное количество камней:
например изначально - (12, 73), Петя - (6, 73) и тут Вася должен сделать ход (5, 73), Петя - (4, 73), Вася - (2, 73), Петя - (1, 73), Вася - (0, 73) или
изначально - (12, 73), Петя - (11, 73) и тут Вася должен сделать ход (6, 73), Петя - (3, 73), Вася - (2, 73), Петя - (1, 73), Вася - (0, 73), и получается ответ 73, но если есть нечётное число 73, то есть и четное - 74.
S = 73 или 74
// Внимание! В других версиях работа не гарантируется!
begin
var a:=ArrRandom(15,-20,20); a.Println;
a:=a.Select(x->x.IsOdd?x*3:x div 2).ToArray; a.Println
end.
Пример
-1 -2 8 8 19 -12 13 -11 -7 -10 3 5 -18 4 3
-3 -1 4 4 57 -6 39 -33 -21 -5 9 15 -9 2 9
А вот так это же самое обычно делают в школах...
const
n=15;
var
a:array[1..n] of integer;
i:integer;
begin
Randomize;
for i:=1 to n do begin
a[i]:=Random(41)-20;
Write(a[i],' ')
end;
Writeln;
for i:=1 to n do begin
if a[i] mod 2=0 then a[i]:=a[i] div 2
else a[i]:=a[i]*3;
Write(a[i],' ')
end;
Writeln
end.