bzoj4318
time limit: 2 sec
memory limit: 128 mb
osu 是一款群眾喜聞樂見的休閒軟體。
我們可以把osu的規則簡化與改編成以下的樣子:
一共有n次操作,每次操作只有成功與失敗之分,成功對應1,失敗對應0,n次操作對應為1個長度為n的01串。在這個串中連續的 x個1可以貢獻x^3 的分數,這x個1不能被其他連續的1所包含(也就是極長的一串1,具體見樣例解釋)
現在給出n,以及每個操作的成功率,請你輸出期望分數,輸出四捨五入後保留1位小數。
第一行有乙個正整數n,表示操作個數。接下去n行每行有乙個[0,1]之間的實數,表示每個操作的成功率。
只有乙個實數,表示答案。答案四捨五入後保留1位小數。 3
0.5
0.5
0.5
6.0【樣例說明】
000分數為0,001分數為1,010分數為1,100分數為1,101分數為2,110分數為8,011分數為8,111分數為27,總和為48,期望為48/8=6.0
n<=100000
定義dp[i]表示當前到第i個位置,得分的期望。
定義隨機變數x表示前i-1個位置(到第i-1處)的連續的1的長度(此處x理解為很多個按一定頻率分布的確定值->乙個長度)
定義l[i]表示到第i個位置,【連續1長度】的期望
那麼有l[i] = pi * (x + 1)這裡的x是很多個值,所以它們按頻率計算後的值就是l[i-1]
我們注意(a的期望 )*(b的期望) 不一定等於(a*b的期望)
所以平方關係需要另外處理。
定義l2[i]表示到第i個位置,【連續1長度平方】的期望
那麼l2[i] = pi * (x + 1)^2 這裡的x仍然是很多個值(很多個長度)
=> l2[i] = pi * (x^2 + 2*x + 1) x^2中,x是很多個值,x^2表示的是位置i-1的連續1長度平方,根據頻率計算後就應該是l2[i-1]
所以l2[i] = pi * (l2[i-1]+2*l[i-1]+1)
定義l3[i]表示到第i個位置,【連續1長度立方】的期望
那麼l3[i] = pi * (x + 1)^3 這裡x含義同上
=>l3[i] = pi * (x^3 + 3 * x^2 + 3 * x + 1) => pi * (l3[i-1]+3*l2[i-1]+3*l[i-1]+1)
對於當前位置i,dp[i] = dp[i-1] + (1- pi)*l3[i-1] 表示當前位置i,前面i-1位置處的連續1串有(1-pi)的可能會斷掉(i處為0)。
最後全部完成後一定會斷掉,所以dp[n] += l3[n]
code:
#include#include#include#include#includeusing namespace std;
const int max = 100000;
int n;
double l[max + 5], l2[max + 5], l3[max + 5];
int main()
rt += l3[n];
printf("%.1lf\n", rt);
return 0;
}
bzoj1462
time limit: 1 sec
memory limit: 162 mb
有n種不同的郵票,皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那裡購買,每次只能買一張,並且買到的郵票究竟是n種郵票中的哪一種是等概率的,概率均為1/n。但是由於凡凡也很喜歡郵票,所以皮皮購買第k張郵票需要支付k元錢。 現在皮皮手中沒有郵票,皮皮想知道自己得到所有種類的郵票需要花費的錢數目的期望。
一行,乙個數字n n<=10000
要付出多少錢. 保留二位小數
321.25
定義f[i]表示手上已經有i種不同的郵票,還需要買f[i]張才可能得到n種不同的郵票
考慮已經有i種郵票,現在要買到一種與前i種郵票不相同郵票需要買多少張
買一次就買到:(n-i)/n*1
買兩次:i/n*(n-i)/n*2
買3次:(i/n)^2*(n-i)/n*3
(n-i)/n * (1 + i/n*2 + (i/n)^2*3 + ...... )
趨近於無窮,求和後為(n-i)/n*(n/(n-i))^2=n/(n-i)
所以f[i] = f[i+1]+n/(n-i)
定義g[i]表示手上已經買到i種不同的郵票,還需要花g[i]元才可能買到n種不同郵票
有兩種可能,第一是i/n的概率買到重複的,計算時幫後面的f[i]次都墊付1元:i/n*(g[i]+f[i]+1)
第二是(n-i)/n的概率買到新的,計算時仍然墊付:(n-i)/n*(g[i+1]+f[i+1]+1)
g[i] = i/n*(g[i]+f[i]+1)+(n-i)/n*(g[i+1]+f[i+1]+1)
code:
#include#include#include#include#includeusing namespace std;
const int max = 100000;
int n;
double f[max + 5], g[max + 5];
int main()
time limit: 10 sec
memory limit: 64 mb
桌面上有r張紅牌和b張黑牌,隨機打亂順序後放在桌面上,開始一張一張地翻牌,翻到紅牌得到1美元,黑牌則付出1美元。可以隨時停止翻牌,在最優策略下平均能得到多少錢。
一行輸入兩個數r,b,其值在0到5000之間
在最優策略下平均能得到多少錢。
5 14.166666
注意定義期望dp時定義應該是乙個未知的值,是乙個期望的值,而不是確定的值,所以本題不能定義為f[i][j]手上拿到i張紅,j張黑得到的錢數,
而應該是f[i][j]手上拿到i張紅j張黑,到拿到所有的牌,還期望得到多少錢
所以f[i][j] = (r-i)/(r+b-i-j)*(f[i+1][j]+1)+(b-j)/(r+b-i-j)*(f[i][j+1]-1)
code:
#include#include#include#include#includeusing namespace std;
int r, b;
double f[2][5005];
int main()
printf("%.6f\n",(int)(f[tg^1][0]*1000000)/1000000.0);
return 0;}/*
5 14.166666
*/
數學期望(360)
題目描述 小明同學最近學習了概率論,他了解到數學期望的定義 設x為乙個隨機變數,x可以取n種不同的取值x1,x2,x3,xn。取x1的概率為p1,取x2的概率為p2,以此類推。定義隨機變數x的數學期望為 e x x1 p1 x2 p2 xn pn。小明回到家中,他想程式設計計算數學期望,你能幫助他麼...
機器學習 數學期望
在概率論和統計學中,數學期望 mean 或均值,亦簡稱期望 是試驗中每次可能結果的概率乘以其結果的總和 嚴格的定義如下 2.數學期望的含義 這個很重要,我們一定要明白概念的含義,聯絡到實際的應用場景中表達的真正意義,數學期望的存在是為了表達什麼?答 反映隨機變數平均取值的大小 談談我對於這兩個概念的...
CodeForces 453A(數學期望)
題目大意給你乙個n面的骰子,投擲m次,問投得最大面的數學期望。數學期望的由來 數學期望,早在17世紀,有乙個賭徒向法國著名數學家 帕斯卡挑戰,給他出了一道題目 甲乙兩個人賭博,他們兩人獲勝的機率相等,比賽規則是先勝三局者為贏家,贏家可以獲得100法郎的獎勵。當比賽進行到第三局的時候,甲勝了兩局,乙勝...