題目 擲骰子
擲n個不同面數的骰子,以最大點數為結果,求點數的期望。一共有n個骰子第i個骰子面數為ni,點數為[1,ni],每個面的概率相同同時擲這n個骰子,所有骰子中的最大點數為最終點數求骰子投出的期望值
輸入
2
2 2
輸出
1.75
輸入
4
1 2 3 4
輸出
2.875
| 分析:這道題目主要考察的知識點為動態規劃動態規劃主要就是要找準它的轉移方程和base case以及目標
首先把所有骰子的輸入放入xi陣列中並且進行排序(倒序 從大到小)
然後建立兩個列表
乙個是res 存放最終的結果
乙個是current 存放遍歷到當前骰子的結果
1.先拿出第乙個骰子 計算第乙個骰子中發生每乙個可能點數的概率並存入res和current中 【規定起始狀態】
2.開始遍歷每乙個骰子 我們把當前的骰子記作p
首先先是計算p這個骰子每一面會發生的概率 就是1/p
p這個骰子在轉的時候 假設最後所有骰子的點數為q
a .之前的骰子都是<q * p這個骰子投出了q
b.之前的骰子剛好出現q * p這個骰子沒投注q
c.之前的骰子出現q * 這個骰子投出了q
3.最後把每個點數 * 概率 求出期望值
舉個例子,,方便大家理解
假設現在有三個骰子
分別為2 3 4 存入x中
先將x排倒序 x=【4,3,2】
說明最多有四種情況 1,2,3,4
然後一開始初始化的時候是選擇骰子面數最多的4
此時res=[0,1/4,1/4,1/4,1/4]
current=[0,1/4,1/4,1/4,1/4]
然後從第二個骰子開始遍歷到第n個骰子
現在第二個骰子是3
投出1,2,3的概率都是1/3
基於第乙個骰子的基礎上 投出第二個骰子
那麼最後結果為x的可能性由以下三個方面組成
1.之前的骰子投出的結果a=sum(res[:j])*(1/xi[i])
(之前出現1,2,3,...,x-1的概率 * 當前出現x的概率)
2.之前骰子投出結果=x的概率 乘以 當前骰子投出b=res[j]*((j-1)/xi[i]
(之前恰好是x * 當前出現1,2,3,...,x-1的概率)
3.之前骰子投出x 乘以 當前骰子投出x的概率
c=res[j]*(1/xi[i])
(之前恰好是x 且當前也是x)
把三種情況的概率相加a+b+c賦值給current[i]然後用current更新res即可
| 總結
n=int(input())
xi=list(map(int,input().split()))
xi.sort(reverse=true)
print(xi)
res=[0]
current=[0]
for i in range(xi[0]):
for i in range(1,n):
for j in range(1,xi[i]+1):
a=sum(res[:j])*(1/xi[i])#之前的骰子投出的結果
一道筆試題
看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...
一道筆試題
上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...
一道筆試題
題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...