史萊姆自爆問題

2021-09-07 18:44:57 字數 1650 閱讀 1749

知乎鏈結

問題:史萊姆最終全部自爆完的概率是多少?

程式設計複雜度太大,因為史萊姆的個數是指數上公升的。

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的遞增整數序列,每個整數表示某只史萊姆的座標,各整數之間用乙個空格分隔。輸出 一行,乙個整數,表示能通話的史萊姆對...