Luogu P2599取石子遊戲(博弈論)

2022-05-01 01:12:13 字數 1013 閱讀 9436

題目鏈結

情況非常複雜,事實上題解我現在也沒有完全理解

不過大致的意思就是

設兩個陣列lef,rig表示對應區間左端加一堆數量為lef的石子使得先手必敗,rig同理

可以通過一堆證明證明求出來的值具有唯一性

所以最後需要判斷lef[2][n]是不是等於a[1]。

對於一段區間[i,j]我們設l=lef[i][j-1],r=rig[i][j-1],x=a[j]

據說lef[i][j]只跟這三個數有關

情況大致分以下五種

1:r=x,此時lef[i][j]=0,因為此時[i,j]已經必敗了,左邊瞎搞就好

2:x3:xr,此時lef[i][j]=x-1,因為這時候先手在左邊拿,後手從右邊xjb拿成同樣結果就行;如果先手在右邊拿,後手從左邊拿完全可以繞回當前的局勢來,如果先手把右邊拿到r,後手直接把lef加的那堆石子清空,先手就gg了

4:x>=l&&x5:x>l&&x>r,lef[i][j]=x。

rig求法跟lef對稱。

#include#include

#include

#include

#include

#define maxn 2020

using

namespace

std;

inline

long

long

read()

while

(isdigit(ch))

return num*f;

}int

lef[maxn][maxn];

intrig[maxn][maxn];

intmain()

if(lef[2][n]==lef[1][1]) printf("

0\n"

);

else printf("

1\n"

); }

return0;

}

P2599 ZJOI2009 取石子遊戲

在研究過nim遊戲及各種變種之後,orez又發現了一種全新的取石子遊戲,這個遊戲是這樣的 有n堆石子,將這n堆石子擺成一排。遊戲由兩個人進行,兩人輪流操作,每次操作者都可以從最左或最右的一堆中取出若干顆石子,可以將那一堆全部取掉,但不能不取,不能操作的人就輸了。orez問 對於任意給出乙個初始乙個局...

取石子遊戲

如下 include include intmain k b a temp floor k 1.0 sqrt 5 2.0 if temp a printf 0 n else printf 1 n return 0 一 巴什博奕 bash game 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每...

取石子遊戲

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。in...