题目链接
大概题意
有一个n面的筛子,问你抛出n个面所需要的期望次数
解题思路
先试了一下规律,试出来期望次数等于n/1+n/2+n/3+… … …+n/n;
还有第二种dp的做法:
我们设dp[i]表示现在已经抛出了i个面,那么转移方程就是
dp[i] = dp[i-1] + n/(n+1-i);
也就是dp[i-1]已经抛出了i-1个面所需的期望次数,还有n-(i-1)个面所以是加上 n/(n+1-i)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
double ans=0;
for(int i=1;i<=n;i++)
ans+=(double)n/(double)i;
printf("%.2f\n",ans);
}
return 0;
}
dp的做法:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
double dp[1005];
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
dp[0]=0;
dp[1]=1;
for(int i=2;i<=n;i++)
dp[i]=dp[i-1]+(double)n/(double)(n+1-i);
printf("%.2f\n",dp[n]);
}
return 0;
}