【SPOJ1026】FAVDICE - Favorite Dice[概率dp]

SPOJ FAVDICE luogu SPOJ1026

一个n面的骰子,求期望掷几次能使得每一面都被掷到

优惠券收集者问题

f[i]表示已掷到i面,期望掷多少面才能使每一面都掷到

\(\frac in\)的概率掷到已掷到的,\(\frac{n-i}f\)的概率掷到未掷到过的

所以\(f[i]=\frac in \times f[i] +\frac {n-i}n \times f[i+1]+1\)

\(掷到已掷到的概率\times已掷到i面还期望掷的次数+掷到未掷到的概率\times掷到i+1面还期望掷的次数\)至少得掷一次所以后面+1

化简得\(f[i]=f[i+1]+\frac n{n-i}\)

#include <iostream>
using namespace std;
const int N=10000+5,M=20000+5,inf=0x3f3f3f3f,P=19650827;
int n;double f[N];
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int main(){
//	freopen("in2.txt","r",stdin);
	//freopen("xor.out","w",stdout);
	int T;rd(T);
	while(T--){
		rd(n);f[n]=0;
		for(int i=n-1;i>=0;--i) f[i]=f[i+1]+(double)n/(n-i);
		printf("%.2lf\n",f[0]);
	}
	return 0;
}
posted @ 2019-08-23 14:53  委屈的咸鱼鱼鱼鱼  阅读(159)  评论(0编辑  收藏  举报