31唇撬、取石子問題
題目:有兩堆石子它匕,數(shù)量任意,可以不同窖认。游戲開始由兩個(gè)人輪流取石子超凳。游戲規(guī)定,每次有兩種不同的取法耀态,
一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時(shí)取走相同數(shù)量的石子暂雹。最后把石子全部取完者為勝者首装。
現(xiàn)在給出初始的兩堆石子的數(shù)目a和b,如果輪到你先取杭跪,假設(shè)雙方都采取最好的策略仙逻,問最后你是勝者還是敗者驰吓。
如果你是勝者,輸出Win,否則輸出Loose系奉。
例如檬贰,a=3,b=1, 則輸出Win(你先在a中取一個(gè),此時(shí)a=2缺亮,b=1,此時(shí)無論對(duì)方怎么取翁涤,你都能將所有石子都拿走).
參考答案:
威佐夫博弈
版權(quán)聲明:本文為CSDN博主「ojshilu」的原創(chuàng)文章,遵循CC 4.0 by-sa版權(quán)協(xié)議萌踱,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明葵礼。
原文鏈接:https://blog.csdn.net/ojshilu/article/details/16812173
a=3
b=1
if a<b:
tmp=a
a=b
b=tmp
k=a-b
a=(int)(k*(1+5.0**0.5)/2.0);
if a==b:
print('Loose')
else:
print('Win')
平衡狀態(tài)(奇異局勢(shì)):
平衡狀態(tài)的概念:
引入一個(gè)概念,平衡狀態(tài)并鸵,又稱作奇異局勢(shì)鸳粉。當(dāng)面對(duì)這個(gè)局勢(shì)時(shí)則會(huì)失敗。任意非平衡態(tài)經(jīng)過一次操作可以變?yōu)槠胶鈶B(tài)园担。每個(gè)玩家都會(huì)努力使自己抓完石子之后的局勢(shì)為平衡届谈,將這個(gè)平衡局勢(shì)留給對(duì)方。因此弯汰,玩家A能夠在初始為非平衡的游戲中取勝艰山,玩家B能夠在初始為平衡的游戲中取勝。
玩法三(2堆石子每次從一或兩堆取一樣數(shù)目的石子):
最后一個(gè)奇異局勢(shì)是(0,0)蝙泼。緊接著的奇異局勢(shì)有(1,2),(3,5),(4,7),(6,10)......
現(xiàn)在把它們看成一個(gè)奇異局勢(shì)組成的序列(0,0),(1,2),(3,5),(4,7),(6,10)......
奇異局勢(shì)的判定:
我們會(huì)發(fā)現(xiàn)這個(gè)序列的規(guī)律程剥,設(shè)序列第k個(gè)奇異局勢(shì)元素為(Ak,Bk),k為自然數(shù)汤踏。那么织鲸,初始條件k=0時(shí)是,A0=B0=0溪胶,遞推關(guān)系為下一個(gè)奇異局勢(shì)的Ak是未在前面出現(xiàn)過的最小自然數(shù)搂擦,且Ak = Bk + k。
上面發(fā)現(xiàn)了奇異局勢(shì)的遞推公式哗脖,那么給出一個(gè)局勢(shì)瀑踢,如何判斷其是否是奇異局勢(shì)呢?
黃金分割數(shù):
數(shù)學(xué)真奇妙才避,竟然發(fā)現(xiàn)橱夭,這個(gè)序列跟黃金分割數(shù)有關(guān)系。黃金分割數(shù)是2/(1+sqrt(5))=(sqrt(5)-1)/2桑逝,其小數(shù)約等于0.61803398875棘劣,其倒數(shù)是(1+sqrt(5))/2,約等于1.61803398875楞遏。
這個(gè)奇異局勢(shì)的序列的通項(xiàng)公式可以表示為:
Ak = [k*(1+sqrt(5.0)/2]
Bk = Ak + k
其中k=0茬暇,1首昔,2,...,n 糙俗,方括號(hào)表示int取整函數(shù)勒奇。
有了這個(gè)通項(xiàng)式子,逆向的巧骚,對(duì)于某一個(gè)局勢(shì)赊颠,只需要判斷其A是否是黃金分割數(shù)的某個(gè)k的倍數(shù),然后再確認(rèn)B是否等于A+k即可网缝。
32巨税、楊輝三角
題目:還記得中學(xué)時(shí)候?qū)W過的楊輝三角嗎?具體的定義這里不再描述粉臊,你可以參考以下的圖形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
..............
先在給你一個(gè)正整數(shù)n草添,請(qǐng)你輸出楊輝三角的前n層
注意:層數(shù)從1開始計(jì)數(shù),每層數(shù)字之間用一個(gè)空格隔開,行尾不要有空格扼仲。
如n=2,則輸出:
1
1 1
參考答案:
n= 6
L = [1]
i = 1
print(1)
while i < n:
L.append(0)
L = [L[j]+L[j-1] for j in range(len(L))]
i += 1
result = ' '.join([str(x) for x in L])
print(result)
33远寸、砝碼問題Ⅱ
題目:有一組砝碼,重量互不相等屠凶,分別為m1驰后、m2、m3……mn矗愧;每種砝碼的數(shù)量有無限個(gè)灶芝。
現(xiàn)要用這些砝碼去稱物體的重量,給你一個(gè)重量n,請(qǐng)你判斷有給定的砝碼能否稱出重量n。
現(xiàn)在給你一個(gè)正整數(shù)列表w和一個(gè)正整數(shù)n唉韭,列表w中的第i個(gè)元素w[i]表示第i種砝碼的重量夜涕,
n表示要你判斷的重量。如果給定砝碼能稱出重量n属愤,輸出Yes女器,否則輸出No。
例如住诸,w=[2,5,11], n=9,則輸出Yes(取兩個(gè)2驾胆,一個(gè)5)。
參考答案:
''' 利用減法求解贱呐,通俗易懂丧诺,耗時(shí)短'''
w=[2,5,11]
n=9
flag = False
while n:
n = min([n-x for x in w if n-x >= 0])
if n == 0:
flag = True
break
elif n <min(w):
break
if flag:
print('Yes')
else:
print('No')