Двое играют в следующую игру. из кучки спичек за один ход игрок вытягивает либо 1, либо 2, либо 1000 спичек. выигрывает тот, кто забирает последнюю спичку. кто выигрывает при правильной игре? входные данные вводится одно натуральное число — n ( 1≤ n ≤ 10000) начальное количество спичек в кучке. выходные данные выведите 1, если выигрывает первый игрок (тот, кто ходит первым), или 2, если выигрывает второй игрок. паскаль

blackale1981 blackale1981    3   02.10.2019 20:40    29

Ответы
Анна111111115 Анна111111115  03.05.2020 15:59

var  n:integer;

begin

read(n);

if (n=1) or (n=2) then writeln('1') else

        if n<=999 then

           if n mod 3 = 0 then writeln('2')

           else writeln('1')

           else if (n-1000) mod 3=0 then writeln('1')

           else writeln('2')

end.

var  n:integer;

begin

read(n);

if (n=1) or (n=2) then write('1') else                      

      if n<=999 then

           if n mod 3 = 0 then writeln('2')

           else writeln('1')

           else if (n-1000) mod 3=0 then write('1')

           else writeln('2')

end.

ПОКАЗАТЬ ОТВЕТЫ
arshavin1099 arshavin1099  12.01.2024 20:56
Для решения этой задачи мы можем использовать метод динамического программирования. Мы создадим массив dp[n+1], где n - это начальное количество спичек в кучке. Здесь dp[i] будет хранить результат игры для i спичек.

Теперь рассмотрим базовые случаи:
- Если кучка имеет 0 спичек, то первый игрок проигрывает. То есть dp[0] = 0.
- Если кучка имеет 1 или 2 спички, то первый игрок всегда выигрывает. То есть dp[1] = dp[2] = 1.

Затем мы можем заполнить остальные значения массива dp используя следующую формулу:

dp[i] = (dp[i-1] == 0 || dp[i-2] == 0 || dp[i-1000] == 0) ? 1 : 0

Это означает, что если первый игрок может выбрать такое количество спичек, чтобы в последующих ходах второй игрок проиграл (то есть dp[i-1], dp[i-2] или dp[i-1000] равно 0), то dp[i] будет равно 1, иначе dp[i] будет равно 0.

Наконец, ответом на задачу будет dp[n]. Если dp[n] равно 1, значит первый игрок выигрывает, иначе второй игрок выигрывает.

Вот полный код решения на языке Pascal:

```pascal
var
n: integer;
dp: array[0..10000] of integer;

function findWinner(n: integer): integer;
begin
dp[0] := 0;
dp[1] := 1;
dp[2] := 1;

for var i := 3 to n do
dp[i] := (dp[i-1] = 0) or (dp[i-2] = 0) or (dp[i-1000] = 0) ? 1 : 0;

Result := dp[n];
end;

begin
readln(n);
writeln(findWinner(n));
end.
```

Этот код принимает входные данные n, вызывает функцию findWinner и выводит результат на экран.

Например, если входными данными будет число 7, то результатом будет 1, что означает, что первый игрок выиграет при правильной игре.

Надеюсь, эта информация была полезной и понятной! Если у вас есть еще вопросы, не стесняйтесь задавать.
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика