1. 程式人生 > >DTOJ 2462: 收集(collecting)

DTOJ 2462: 收集(collecting)

2462: 收集(collecting)
時間限制: 1 S e c 1 Sec 記憶體限制: 128 M

B 128 MB O 2 O2
提交: 85 85
解決: 62 62

題目描述
教育超市最近進行一項促銷活動,凡是購物消費就可以獲得小玻璃珠一個。喜愛收集小玩意兒的 x y xy

當然不會錯過這個活動。假定一共有 n n 種顏色的玻璃珠,每次發放玻璃珠的顏色是隨機的(即獲得每種顏色的玻璃珠的概率是相同的)。 x y xy 想知道要收集所有顏色的珠子,期望購買的次數是多少。

輸入
僅一行,一個非負整數 n n ,表示總數。

輸出
僅一行,一個實數,表示答案,保留 4 4 位小數。

樣例輸入
輸入樣例一
1
輸入樣例二
2
樣例輸出
輸出樣例一
1.0000
輸出樣例二
3.0000
提示
【資料範圍及約定】

對於 40 % 40\% 的資料,有 0 n 20 0≤n≤20

對於 70 % 70\% 的資料,有 0 n 1000 0≤n≤1000

對於 100 % 100\% 的資料,有 0 n 10000 0≤n≤10000

題解:

很經典的一道期望好題。

我們設 f i f_{i} 表示我已經取到前 i i 種顏色,要取第 i + 1 i+1 種不同的物品的期望步數。

所以要麼一步就可以得到下一種顏色,即 1 × n i n 1\times \frac{n-i}{n}

要麼取到已經取到的顏色,即 i n × ( f i + 1 ) \frac{i}{n}\times (f_{i}+1)

解方程,即可得出 f i = n n i f_{i}=\frac{n}{n-i}

程式碼如下(就一行23333

double n,s,i;int main(){scanf("%lf",&n);for(i=1;i<=n;i++)s+=n/i;printf("%.4lf",s);}