知乎鏈結
問題:史萊姆最終全部自爆完的概率是多少?
程式設計複雜度太大,因為史萊姆的個數是指數上公升的。
import numpy as np
n = 10 # 天數
m = 4 # 每天的**情況數
c = (m - 1) ** n + 1 # 最多多少只
def go(a, ind, cnt, n, left):
if ind == m - 1:
cnt[ind] = n - sum(cnt[:m - 1])
c = int(np.sum(cnt * np.arange(m)))
if c < c:
a[c] += (1 / m) ** n
return
for i in range(left + 1):
cnt[ind] = i
go(a, ind + 1, cnt, n, left - i)
cnt[ind] = 0
def get(n):
# n隻變多的概率
a = np.zeros(c)
cnt = np.zeros(m)
go(a, 0, cnt, n, n)
return a
def main():
a = np.zeros(c)
a[1] = 1
for i in range(n):
b = np.zeros(c)
for j in range(c):
if a[j] > 0:
b += get(j) * a[j]
a = b
print('day', i, a[0])
main()
這道題其實應該用方程思想:設乙隻史萊姆**的概率是p,$p=\frac+\frac+\frac+\frac$,p=sqrt(2)-1或者1或者-sqrt(2)-1(舍)
當每次等概率做2件事,保持現狀和**時,一定會滅亡。
當每次等概率做3件事,**、保持現狀、**繁殖時,一定會滅亡。
只有當每次等概率做4件事,**、保持現狀、乙個變兩個、乙個變三個時,才有可能避免滅亡。
實際上,還有一種估算的方式
進行模擬實驗case_count次,每個case迭代turn_count輪,看看最終extinct的case的個數。結果還算精確。
import random
extinct = 0
case_count = 10000
turn_count = 1000
for i in range(case_count):
cnt = 1
died = false
for turn in range(10):
nex = cnt
for j in range(cnt):
inc = random.randint(0, 3)
nex += inc - 1
if nex == 0:
died = true
break
else:
cnt = nex
if died:
extinct += 1
print(extinct / case_count)
關於我轉生變成史萊姆這檔事
c 版本一 題解 思路 二分 搜尋,每次二分利姆魯的初始攻擊值,如果這個攻擊值能夠拯救到靜就將mid賦值給ub,同時令ans mid,否則就將mid賦值給lb,最後輸出ans即可。includeusing namespace std int t,n,sx,sy,ex,ey int mp 505 50...
基本演算法的設計與實現 史萊姆通話
題目描述 有n只史萊姆在數軸上站成一列,距離小於等於k的兩隻史萊姆之間可以相互通話。請問有多少對史萊姆之間能通話?輸入 兩行,第一行,兩個整數n和k,其中n 500 第二行,乙個長度為n的遞增整數序列,每個整數表示某只史萊姆的座標,各整數之間用乙個空格分隔。輸出 一行,乙個整數,表示能通話的史萊姆對...