poj 2234基礎Nim博弈 sg博弈

2022-09-08 16:33:24 字數 1620 閱讀 8010

poj 終於突破200大關了,mark一下。hdu也快要300了。加油

題意:有n堆石子,每人每次可以從一堆中拿走任意多個,兩人輪流操作,誰無子可取誰輸。輸入n堆石子各自的數量,輸出先手是否能贏。

分析:np問題,必勝態n(next player wins),必敗態p(previous player wins)

如果某狀態的直接後繼中有必敗態那麼它一定是必勝態,否則為必敗態。

sg函式。設函式g(x)。我們先把所有的最終局面(最終局面均為必敗p局面)g(x)賦值為0。然後所有其他局面g(x)等於其直接後繼狀態中沒有出現過的最小自然數。這樣一來所有是g(x)=0的狀態就是必敗態,其他為必勝態。

根據定理:有這樣乙個遊戲,是多個遊戲共同進行,每個遊戲都執行到底時才算整個遊戲結束,每次乙個選手可以把乙個遊戲進行一步。對於這樣的遊戲它的某狀態的g(x)值,為每個子遊戲的現在所處的狀態的g(x)值抑或起來的結果。

所以對於本題,我們只需要研究一堆石子的g(x)的規律即可得出若干堆石子共同進行的勝敗。

對於乙個有n個石子的堆,其開始狀態(有n個石子,沒有被取過)g(x)=n;

view code

//

i'm lanjiangzhou//c

#include #include

#include

#include

#include

#include

//c++

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

//*************************output*************************

#ifdef win32

#define int64 "%i64d"

#define uint64 "%i64u"

#else

#define int64 "%lld"

#define uint64 "%llu"

#endif

//**************************constant***********************

#define inf 0x3f3f3f3f

//aply for the memory of the stack

//#pragma comment (linker, "/stack:1024000000,1024000000")

//end

const

int maxn =100+10

;int

a[maxn];

intmain()

}if(t==0

)

else

if(t)

}return0;

}

poj 百練 2798 基礎題

回顧二進位製到16進製制的方法 可以直接做 也可以從二轉到10,10轉到16 看似容易 實則很需要細心,如何擺弄下標位置,如何計算邊界,如何儲存結果 include include include using namespace std define cdebbug 全域性資料 int main i...

POJ1010 搜尋題基礎

雖然也認同這題是基礎的搜尋題,但因做題太不熟練,寫了好久 include include include using namespace std const int n 4 const int nn 1000 int n,types,sum,maxz,a nn hash nn p n s n boo...

POJ 2516 基礎費用流

題意 有n個顧客,m個 商,k種貨物,給你顧客對於每種貨物的要求個數,和 商對於每種貨物的現有量,以及 每種貨物的時候 商和顧客之間的運輸單價,問你滿足所有顧客的前提下的最小運輸費用是多少。思路 滿足所有顧客的前提下的最小花費,很容易就想到了費用流,但是做這個題目有個小竅門,如果不想的話很可能把每個...