日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小明的游戏(博弈论)

發布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小明的游戏(博弈论) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

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-=1

2.小明的游戲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)等等,稱這些局勢為“奇異局勢”。通過觀察不難發現,奇異局勢有兩個特征:

  • 差值是遞增的,分別是?0, 1, 2, 3, 4, ;
  • 每個局勢的第一個值是未在前面出現過的最小的自然數。
  • 推導奇異局勢時,用到的黃金分割數需要較高的精度,直接用 1.618 這個估值是不行的。在代碼中用公式計算高精度黃金分割數
  • :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”。?
  • n≤m?時,由于一次最少拿?1?個,最多拿?m?個,甲可以一次拿完,先手贏。
  • n = m+1 時,無論甲拿走多少個(1~m?個),剩下的都多于 1?個、少于等于 m?個,乙都能一次拿走剩余的石子,后手取勝。
  • 如果?n?%?(m+1) = 0,即?n是?m+1 的整數倍,那么不管甲拿多少,例如 k?個,乙都拿?m+1-k 個,使得剩下的永遠是?m+1 的整數倍,直到最后的 m+1?個,所以后拿的乙一定贏。
  • 如果?n?%?(m+1) != 0,即?n?不是?m+1 的整數倍,還有余數?r,那么甲拿走?r?個,剩下的是?m+1 的倍數,相當于甲、乙互換,結果是甲贏。
  • n,m=map(int,input().split()) if n%(m+1)==0:print('second') else:print('first')

    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?人就贏了。
    T=int(input()) while T>0:n=int(input())if n%6 :print("first")else:print("second")T-=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())])

    ?

    總結

    以上是生活随笔為你收集整理的小明的游戏(博弈论)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。