1. 程式人生 > >洛谷1288 取數遊戲II 博弈論

洛谷1288 取數遊戲II 博弈論

can ios i++ return include 沒有 繼續 位置 是你

洛谷1288 取數遊戲II 博弈論
最優策略 一定是你一步把值走完,然後我再走完,這樣不給別人留後路
然後這樣走 只要自己從左走 或者從右走其中有一個有奇數步可走,則說明是必勝局
如果都是只能走偶數步的,就是必敗局 、

另一個題解

首先,對於一條鏈a1,a2,a3,a4......0 如果是偶數條邊,那麽現手一定贏,因為他每一次都只
用把後面一條取完,例如

5 4 3 6 5 0

先手取完5,後手沒法回到前一個位置,而無論接下來後手去多少,先手繼續取完3,再然後取
完5,後手沒辦法再去,先手贏。就這樣,如果從起點到第一個出現0的地方一共有偶數條邊,先
手可以一步一步將後手被迫向前逼近,直到無法移動(由於是環,還應該考慮向後逼近)。

同樣的,如果這有奇數個,那麽先手第一步無論怎麽取,都將自己置於一個必敗狀態(此時對於
後手來說邊數變成偶數),就一定沒有必勝狀態

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iostream> 
 8 #include <iomanip> 
 9 using
namespace std ; 10 11 const int maxn = 21 ; 12 int n,x ; 13 int a[maxn] ; 14 15 int main() 16 { 17 scanf("%d",&n) ; 18 for(int i=1;i<=n;i++) scanf("%d",&a[ i ]) ; 19 x = 0 ; 20 for(int i=1;i<=n;i++) 21 if(a[ i ]) x++ ; 22 else break ; 23 if
(x&1) 24 { 25 printf("YES\n") ; 26 return 0 ; 27 } 28 x = 0 ; 29 for(int i=n;i>=1;i--) 30 if(a[ i ]) x++ ; 31 else break ; 32 if(x&1) 33 { 34 printf("YES\n") ; 35 return 0 ; 36 } 37 printf("NO\n") ; 38 return 0 ; 39 }

洛谷1288 取數遊戲II 博弈論