题目描述: 小张很多年过年都没有回家了。这次回家父母给他安排了很多个相亲的姑娘,有一个很长的名单,长度为N. 父亲安排约会,每次随机选择一个要相亲的对象,母亲则负责记录哪些姑娘已经约会过了。直到和所有的姑娘都约会完一遍以后,这个浩大的相亲工程才会结束。这些天父母在吵架,他们之间不会有任何言语沟通。所以父亲不知道哪些姑娘已经约会过了。因此下次约会的对象很可能是以前已经约会过的。如果小张要把所有的姑娘都约会一遍,那么平均要约会多少个姑娘。
题目分析: 这道题其实思路和又放回随机抽样小球,直到所有的小球都被抽到至少一次,求抽取次数的期望类似。 (类似的题目还有,连续抛硬币,求第一次连续出现n个正面的时候,抛硬币次数的期望)
分析 :假设f(i)表示目前已经相亲了i个不同的姑娘,还要相亲才能把n个姑娘全部相亲完的期望。
因为已经相亲了i个不同的姑娘后,在相亲一个姑娘,这个姑娘是这i个人中间的其中一个人的概率是i/n,是另外还没有相亲过的姑娘的概率是(n-i)/n。那么很容易得出,
f(i)=in∗f(i)+n−in∗f(i+1)+1
,显然f(n)=0, 我们要求f(0)
显然,
f(0)=n1+n2+n3+...nn
.
//2017阿里实习生招聘编程题之相亲约会
#include<iostream>
using namespace std;
int main()
{
int n,i;
cin>>n;
double sum=0;
for(i=1;i<=n;i++)
{
sum+=double(n)/i;
}
cout<<"平均要约会姑娘的个数为:"<<sum<<endl;
return 0;
}