小明的游戏(博弈论)
目錄
1.小明的游戲1(尼姆博弈)
2.小明的游戲5(?威佐夫游戲)
3.巴什游戲
4.石子游戲
5.取球游戲
1.小明的游戲1(尼姆博弈)
題目描述
藍橋公司給他們的員工準備了豐厚的獎金,公司主管小明并不希望發太多的獎金,他想把獎金留給智慧的人,于是他決定跟每一個員工玩一個游戲,規則如下:
- 桌面上一共有?n 堆一元錢。
- 雙方輪流行動,由小明先行動,每次行動從某一堆錢中拿走若干元(至少一元錢),取走最后一元錢的人獲勝。
請問員工們能拿到獎金嗎?
輸入描述
第一行為一個整數?T,表示測試數據數量。
每個測試用例包含倆行。第一行為一個整數?n , 第二行包括?n 個整數 a1?,a2?...an??表示第 i?堆有 ai??元。
1≤T,n≤10^5,1≤ai?≤10^9?。
保證所有測試用例的?n?的和不超過 2×10^5。
輸出描述
如果員工能拿到獎金輸出?YES??, 否則輸出?NO。
輸入輸出樣例
示例 1
輸入
3 2 1 1 1 1 3 2 2 1輸出
YES NO NO定理:
- 若?a1?⊕a2?⊕?⊕an?!=0,先手必勝,記此時的狀態為N-position
- 若?a1?⊕a2?⊕?⊕an?=0,先手必敗,記此時的狀態為P-position
(⊕?表示異或運算)
T = int(input()) while T > 0:n = int(input())ans = 0a = list(map(int, input().split()))for i in range(n):ans ^= a[i]if ans!=0:print('NO')else:print('Yes')print()T-=12.小明的游戲5(?威佐夫游戲)
?題目描述
藍橋公司給他們的員工準備了豐厚的獎金,公司主管小明并不希望發太多的獎金,他想把獎金留給智慧的人,于是他決定跟每一個員工玩一個游戲,規則如下:
-
桌面上一共倆堆錢分別為?a?元和?b?元。
-
雙方輪流行動,由小明先行動,每次行動可以從任意一堆拿任意元,或者從倆堆拿相同的任意元。取走最后一元錢的人獲勝。
請問員工們能拿到獎金嗎?
輸入描述
第一行為一個整數?T,表示測試數據數量。 (1≤T≤105)
每個測試用例包含一行。每行為倆個整數?a?和?b?。(1≤a,b≤10^18)分析兩堆石子的數量(a,b),使先手必輸的局勢有:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9, 15)等等,稱這些局勢為“奇異局勢”。通過觀察不難發現,奇異局勢有兩個特征:
:double gold = (1 + sqrt(5))/2;
輸出描述
如果員工能拿到獎金輸出?YES?, 否則輸出?NO。
輸入輸出樣例
示例 1
輸入
3 2 1 8 4 4 7輸出
YES NO YES知識點總結
威佐夫博弈是指的這樣一個問題:有兩堆各若干個物品,兩個人輪流從任意一堆中取出至少一個或者同時從兩堆中取出同樣多的物品,規定每次至少取一個,至多不限,最后取光者勝利。
假設兩堆石子為(x,y)(其中x<y)
那么先手必敗,當且僅當(y-x)*(1 + sqrt(5))/2=x
t = int(input()) for i in range(1 , t + 1):a,b = map(int,input().split())c = ((5**(0.5)) + 1) / 2if a > b:a,b = b,aif int((b-a)*c) == a:print("YES")else:print("NO")3.巴什游戲
- 題目描述:有?n?顆石子,甲先取,乙后取,每次可以拿 1~m?顆石子,輪流拿下去,拿最后一顆的獲勝。
- 輸入:n和?m,1≤n,m≤1000。
- 輸出:如果先拿的甲贏了,輸出“first”,否則輸出“second”。?
4.石子游戲
題目描述
兩人玩游戲,游戲內容為下:
有?n?個石頭,兩人每次可以從這?n?個石頭中取?p^k?個(p?是任意質數,k?是任意自然數,p^k?要求不大于當前剩余石頭數),誰能取走最后石頭,誰就獲勝了。
問先手取石頭的人,有沒有必勝的策略。如果先手有,則輸出?first,否則輸出?second。
輸入描述
輸入第一行包含一個正整數?T,表示測試數量。
接下來后面T?行,每行包含一個正整數?n,表示石頭個數。
1≤T≤10^5,1≤n≤10^6。
輸出描述
輸出共?T?行,每行分別為?first?或?second。
樣例輸入
3 3 6 9樣例輸出
first second first- 如果?n是?6?的倍數,第二人贏。
- 如果?n?不是?6?的倍數,第一人拿走 1~5?個石頭后,使得剩下數量的是?6?的倍數,那么第?1?人就贏了。
5.取球游戲
題目描述
今盒子里有?n?個小球,A、B 兩人輪流從盒中取球,每個人都可以看到另一個人取了多少個,也可以看到盒中還剩下多少個,并且兩人都很聰明,不會做出錯誤的判斷。
我們約定:
每個人從盒子中取出的球的數目必須是:1,3,7 或者 8 個。輪到某一方取球時不能棄權!A 先取球,然后雙方交替取球,直到取完。被迫拿到最后一個球的一方為負方(輸方)
請編程確定出在雙方都不判斷失誤的情況下,對于特定的初始球數,A 是否能贏?
輸入描述
先是一個整數?n?(n<100),表示接下來有?n?個整數。
然后是?n?個整數,每個占一行(整數<?10^4),表示初始球數。
輸出描述
程序則輸出?n?行,表示 A 的輸贏情況(輸為 0,贏為 1)。
輸入輸出樣例
示例
輸入
4 1 2 10 18輸出
0 1 1 0 dp = [0 for i in range(10001)] dp[2] = dp[4] = dp[6] = dp[8] = 1 for i in range(9,len(dp)):if dp[i - 1] == 0:dp[i] = 1elif dp [i - 3] == 0:dp[i] = 1elif dp[i-7] == 0:dp[i] = 1elif dp[i-8] == 0:dp[i] = 1 n = int(input()) for i in range(n):print(dp[int(input())])?
總結
以上是生活随笔為你收集整理的小明的游戏(博弈论)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建个网站需要多少钱?你真的知道吗?
- 下一篇: 多智能体强化学习综述-Lucian Bu