題目:
1426: 收集郵票
time limit: 1 sec memory limit: 162 mb
description
有n種不同的郵票,皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那裡購買,每次只能買一張,並且買到的郵票究竟是n種郵票中的哪一種是等概率的,概率均為1/n。但是由於凡凡也很喜歡郵票,所以皮皮購買第k張郵票需要支付k元錢。 現在皮皮手中沒有郵票,皮皮想知道自己得到所有種類的郵票需要花費的錢數目的期望。
input
一行,乙個數字n n<=10000
output
要付出多少錢. 保留二位小數
sample input
3sample output
21.25
思路:受noip吧主指點,終於知道遞推式怎麼來的了_(:з」∠)_
定義g[i]表示現有i張,買到n張所需要購買的期望張數
定義pr(x,i)表示買x次能從i種買到n種的概率
那麼有
且有
從此我們可以知道g[0]~g[n]的值
定義f[i][j]表示現有i張、買下一張要花j塊錢,買到n張所需購買的期望**
那麼f[i][j]有i/n的概率轉移到f[i][j+1],(n-i)/n的概率轉移到f[i+1][j+1],並且兩者的代價都是j
可以得到狀態轉移:f[i][j]=j+f[i][j+1]*i/n+f[i+1][j+1]*(n-i)/n
但是f[i][j]的j是無限的,所以這個遞推無法進行,考慮f[i][j]與f[i][j+1]的關係,有
且有
那麼有f[i][j]關於f[i+1][j]的狀態轉移:
再來看看我們的求解,我們只關心f[0][1]是多少,所以,對於j不等於1的情況我們可以忽略
那麼定義f[i]表示f[i][1],有
特別的,f[n][1]=0,所以f[n]=0
這條關於f[i]的表示式我們已知了f[n]的值與g[0]~g[n]的值,那麼我們就可以遞推出f[0][1]=f[0]的值,問題到此就可以解決了
#includedouble g[10005];
double f[10005];
int main()
return 0;
}
BZOJ 1426 收集郵票
有n種不同的郵票,皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那裡購買,每次只能買一張,並且買到的郵票究竟是n種郵票中的哪一種是等概率的,概率均為1 n。但是由於凡凡也很喜歡郵票,所以皮皮購買第k張郵票需要支付k元錢。現在皮皮手中沒有郵票,皮皮想知道自己得到所有種類的郵票需要花費的錢數目的期...
bzoj 1426 收集郵票
f i 當前已擁有i種郵票,還需要買的郵票數的期望值。g i 當前已擁有i種郵票,還需要的錢的期望值。每張郵票初始都是1元錢,每買一張郵票,還沒購買的郵票每張都漲價1元。f i 1 n i n f i 1 i n f i f i f i 1 n n i g i 1 n i n g i 1 f i 1...
BZOJ1426 收集郵票
題面傳送門 令 f i 表示還剩 i 種模板沒有收集到,期望還需要買幾個模板 f i frac times f i frac times f i 1 1 解得 f i f i 1 n i 令 dp i 表示有 i 種模板沒收集到,期望需要多少錢買模板 dp i frac times dp i f i...