SP1026 FAVDICE - Favorite Dice
一.前言
沉浸在中考成绩的悲伤中……上连接
二.思路
我就明说了吧,期望,期望!期望二字都给我A到脸上来了……但是期望怎么做呢?我也不会也?
好吧好吧,分析一下。
首先思路1,假设当前已经扔出了i个不同的面,那么下一次扔出一个新的面的概率是(dfrac{n-i}{n}),扔出一个新面的期望是(dfrac{n}{n-i}),(概率乘期望等于1奥,这很重要,要区分开)故易得式子(期望分步互不冲突,加法原理) (ans=sum^n_{i=1} dfrac{n}{n-i}) ,然后i与n-i是等价的,转换一下得 (ans=sum^n_{i=1} dfrac{n}{i})
然后思路2,这个其实比较常规奥,用的是递推。设 (f[i]) 表示已经扔出i个不同的面,后为了扔出所有面,还需要扔的次数的期望。,显然答案是 (f[0]) 且 (f[n]=0),然后分成两种情况,现在扔一次,得出的面不是一个新面,(概率为 (dfrac{i}{n})),这次其实相当于作废,还需要扔 (f[i]) 次才行,如果得出的面是一个新面,(概率为 (dfrac{n-i}{n})),则只需要还扔 (f[i+1]) 次就行。因为是有是否出新面的大前提,相互影响,乘法原理。本身是扔了一次的,三个部分结合一下。可以得出一个式子。
[f[i]=frac{i}{n}f[i]+frac{n-i}{n}f[i+1]+1;
]
很显然,熟知递推的你可能会跟呆呆的我一样有大大的疑惑,明明左右都有 f[i] 这个怎么转移?答案是,这不是转移方程。,把转移二字去掉,这个方程是成立的,并且可以解出 f[i] 与 f[i+1] 的关系,那才是转移方程。,那么解它。
[f[i]=frac{i}{n}f[i]+frac{n-i}{n}f[i+1]+1\
frac{n-i}{n}f[i]=frac{n-i}{n}f[i+1]+1\
ecausefrac{n-i}{n}!=0\
f[i]=f[i+1]+frac{n}{n-i}\
herefore ans=sum^n_{i=1} dfrac{n}{i}
]
三.CODE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<fstream>
using namespace std;
int n,t;
double ans;
int main(){
cin>>t;
while(t--){
ans=0.0;
cin>>n;
for(int i=1;i<=n;++i)ans+=1.00*n/i;
printf("%.2f
",ans);
}
return 0;
}