有個nn
n級台階,每級台階有若干石子,第i
ii級台階上有a
ia_i
ai個石子(i≥1
i\ge 1
i≥1)。兩個玩家輪流操作,每個玩家可以從第i
ii級台階上拿任意多個石子放到第i−1
i-1i−
1級台階上,可以全拿但不能不拿。已經拿到地面上的石子不能再拿。無法操作者視為失敗。問先手是否存在必勝策略。
輸入格式:
第一行包含整數n
nn。第二行包含n
nn個整數,其中第i
ii個整數表示第i
ii級台階上的石子數a
ia_i
ai。
輸出格式:
如果先手方必勝,則輸出「yes」。否則,輸出「no」。
資料範圍:
1 ≤n
≤105
1\le n\le 10^5
1≤n≤1051≤
ai≤1
09
1\le a_i\le 10^9
1≤ai≤
109我們證明,當a1∧
a3∧.
..∧a
2k−1
≠0
a_1\wedge a_3\wedge ...\wedge a_\ne 0
a1∧a3
∧..
.∧a2
k−1
=0
時先手有必勝策略。證明如下,首先證明三個結論:
1、首先當所有台階都沒有石子時,是個必敗狀態。這是顯然的;
2、如果a1∧
a3∧.
..∧a
2k−1
≠0
a_1\wedge a_3\wedge ...\wedge a_\ne 0
a1∧a3
∧..
.∧a2
k−1
=0
,先手總可以適當移動石子,使得移動完之後a1∧
a3∧.
..∧a
2k−1
=0
a_1\wedge a_3\wedge ...\wedge a_= 0
a1∧a3
∧..
.∧a2
k−1
=0;3、如果a1∧
a3∧.
..∧a
2k−1
=0
a_1\wedge a_3\wedge ...\wedge a_= 0
a1∧a3
∧..
.∧a2
k−1
=0,先手無論怎麼移動石子,移動完之後都有a1∧
a3∧.
..∧a
2k−1
≠0
a_1\wedge a_3\wedge ...\wedge a_\ne 0
a1∧a3
∧..
.∧a2
k−1
=0
。兩者的證明都可以參考經典nim遊戲的證明方法:
由於這個遊戲必然停止,如果一開始a1∧
a3∧.
..∧a
2k−1
≠0
a_1\wedge a_3\wedge ...\wedge a_\ne 0
a1∧a3
∧..
.∧a2
k−1
=0
,那麼先手總可以適當操作,使得後手永遠都面對a1∧
a3∧.
..∧a
2k−1
=0
a_1\wedge a_3\wedge ...\wedge a_= 0
a1∧a3
∧..
.∧a2
k−1
=0的局面,而當遊戲結束的時候,必敗局面a1=
a2=.
..=a
n=
0a_1=a_2=...=a_n=0
a1=a2
=..
.=an
=0必然是後手遇到的,所以先手有必勝策略。反之,後手有必勝策略。**如下:
#include
using
namespace std;
const
int n =
100010
;int a[n]
;int
main()
cout <<
(res !=0?
"yes"
:"no"
)<< endl;
return0;
}
時間複雜度o(n
)o(n)
o(n)
,空間o(1
)o(1)
o(1)
。
Acwing 892 台階 Nim遊戲
現在,有乙個n級台階的樓梯,每級台階上都有若干個石子,其中第i級台階上有ai個石子 i 1 兩位玩家輪流操作,每次操作可以從任意一級台階上拿若干個石子放到下一級台階中 不能不拿 已經拿到地面上的石子不能再拿,最後無法進行操作的人視為失敗。問如果兩人都採用最優策略,先手是否必勝。輸入格式 第一行包含整...
第39階台階
小明剛剛看完電影 第39級台階 離開電影院的時候,他數了數禮堂前的台階數,恰好是39級 站在台階前,他突然又想著乙個問題 如果我每一步只能邁上1個或2個台階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級台階,有多少種不同的上法呢?請你利用計算機的優勢,幫助小明尋...
39階台階問題
39級台階問題 小明看完電影 第39級台階 離開電影院的時候,他數了數視覺的台階數,恰好是39級。站在台階前,他突然又想起乙個問題 如果我每一步只能邁上1個或2個台階,先邁左腳,然後左右交替,最後一步邁右腳,也就是說一共要邁偶數步。那麼,上完39級台階,有多少種不同的上法呢?請利用計算機的優勢,幫助...