洛谷 1247 取火柴遊戲

2021-08-20 14:37:13 字數 1252 閱讀 4615

題目描述

輸入k及k個整數n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根數為ni;接著便是你和計算機取火柴棒的對弈遊戲。取的規則如下:每次可以從一堆中取走若干根火柴,也可以一堆全部取走,但不允許跨堆取,也不允許不取。

誰取走最後一根火柴為勝利者。

例如:k=2,n1=n2=2,a代表你,p代表計算機,若決定a先取:

a:(2,2)→(1,2)

p:(1,2)→(1,1)

a:(1,1)→(1,0)

p:(1,0)→ (0,0)

如果決定a後取:

p:(2,2)→(2,0)

a:(2,0)→ 0,0)

又如k=3,n1=1,n2=2,n3=3,a決定後取:

p:(1,2,3)→(0,2,3)

a:(0,2,3)→(0,2,2)

a已將遊戲歸結為(2,2)的情況,不管p如何取a都必勝。

編乙個程式,在給出初始狀態之後,判斷是先取必勝還是先取必敗,如果是先取必勝,請輸出第一次該如何取。如果是先取必敗,則輸出「lose」。

輸入輸出格式

輸入格式:

第一行,乙個正整數k

第二行,k個整數n1,n2,…,nk

輸出格式:

如果是先取必勝,請在第一行輸出兩個整數a,b,表示第一次從第b堆取出a個。第二行為第一次取火柴後的狀態。如果有多種答案,則輸出< b,a>字典序最小的答案(即b最小的前提下a最小)。

如果是先取必敗,則輸出 「lose」。

輸入輸出樣例

輸入樣例#1:

3 3 6 9

輸出樣例#1:

4 3

3 6 5

輸入樣例#2:

4 15 22 19 10

輸出樣例#2:

lose

說明k<=500000

ni<=1e9

時限2s

#include

using

namespace

std;

const

int maxn = 500005;

int k,a[maxn];

int ans;

int main()

if(ans==0)

for(int i=1;i<=k;i++)

for(int i=1;i<=k;i++)

printf("%d ",a[i]);

return

0;}

洛谷 1247 取火柴遊戲

題目描述 輸入k及k個整數n1,n2,nk,表示有k堆火柴棒,第i堆火柴棒的根數為ni 接著便是你和計算機取火柴棒的對弈遊戲。取的規則如下 每次可以從一堆中取走若干根火柴,也可以一堆全部取走,但不允許跨堆取,也不允許不取。誰取走最後一根火柴為勝利者。例如 k 2,n1 n2 2,a代表你,p代表計算...

洛谷 P1247 取火柴遊戲(nim 遊戲)

簡單說一下 nim遊戲 的博弈原理,先將 a i 轉化成二進位制數,那麼題目變成了每一次可以取走任意 a i 的 任意個 1sum 是所有 a i 的異或值如果 sum 0,說明有偶數個 1,先手拿 x,後手也拿 x,先手必敗如果 sum 0,我們考慮去掉一堆,這 n 1 堆相互異或得到的結果 re...

P1247 取火柴遊戲

輸入k及k個整數n1,n2,nk,表示有k堆火柴棒,第i堆火柴棒的根數為ni 接著便是你和計算機取火柴棒的對弈遊戲。取的規則如下 每次可以從一堆中取走若干根火柴,也可以一堆全部取走,但不允許跨堆取,也不允許不取。誰取走最後一根火柴為勝利者。例如 k 2,n1 n2 2,a代表你,p代表計算機,若決定...