博弈論學習筆記

2021-08-03 23:07:03 字數 1370 閱讀 4823

eg:hdu2149,2156

描述:只有一堆n個石子,每次能取1到m個物品,a先手,問誰能先取完石子

思路:這種問題的關鍵就在於能否取到關鍵點,比如,這裡只能能取到倒數m+2個石子,留下m+1個石子,則後者就必敗。

結論:如果初始石子是(m+1)的倍數,則先手必敗,否則先手必勝。eg:hdu2177,hdu5754

描述:有兩堆物品,每堆都有若干物品。每次可以從一堆中取任意物品,也可以從兩堆中取一樣多的任意個物品。先取光者獲勝。

思路:就是列舉必敗態發現規律(最終思想sg函式差不多之後會介紹一下sg函式),可以列舉前幾個必敗態,(0, 0), (1, 2), (3, 5), (4, 7), (6, 10), (8, 10)…..

最後得到結論:ak

=[k1

+5√2

],bk

=ak+

k

**判斷:

#include

using

namespace

std;

int main()

return

0;}

描述:有n堆石子,每堆有ai

個,兩人輪流從一堆中取任意個物品,誰把最後乙個石子取光誰贏

結論:把所有石子個數異或起來,值為0則先手敗,值為1則先手勝。

**判斷:

#include

using

namespace

std;

int a[11111];

int main()

int ans = 0;

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

if(ans == 0) cout

<< "後手勝"

<< endl;

else

cout

<< "先手勝"

<< endl;

}return

0;}

eg:hdu1907這題需求和尼姆相反,取完最後乙個的失敗,所以綜上所述,結論是,如果異或值是0,且所有數都小於2,則先手敗,如果異或值是1,且所有數都是1,也是先手敗。其他情況都是先手勝。

**實現:

#include

using

namespace

std;

int a[11111];

int main()

int ans = 0;

int fa = 0;

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

if(ans == 0 && fa == 0 || ans != 0 && fa == 1)

else

}return

0;}

博弈論學習筆記

個人實在太懶 所以直接抄啦 點球案例 在一次足球比賽罰點球時,罰球隊員可以選擇l,m,r三種不同射門路徑 門將可以選擇撲向左路或者右路 原則上講他也可以守在右路 lr l4,4 9,9 m6,6 6,6 r9,9 4,4 該錶表示各自的收益,其中,lr對應的9表示當射手射向左路而門將撲向右路時,射手...

學習筆記 博弈論

博弈論的題比較重思路,都比較好寫,所以我打算腦內做題不寫 梳理一下遇到的博弈論題目的思路。題意是給乙個由數字0 9和問號構成的字串,長度為n,n為偶數 需要注意可能沒有問號 b和m兩人輪流用數字替換問號,m先手,若所有問號都被替換後前一半的數字之和等於後一半的數字之和,b勝,否則m 勝。考慮三種情況...

博弈論學習筆記

好久以前不記得在那本初賽資料上看到第一章就是博弈論,看了一頁紙,那時候還不知道有多難,就只是感性地用數學去理解 感覺不難,就沒搞了。考了好幾次博弈論的題,發現毛都不會,又老聽旁邊 mital 和 skounputer 講什麼 sg 函式,心態 於是還是決定自己學一下。蒟蒻決定先把幾個經典的例子學會了...