495. Kids and Prizes
Time limit per test: 0.25 second(s)
Memory limit: 262144 kilobytes
Memory limit: 262144 kilobytes
input: standard
output: standard
output: standard
ICPC (International Cardboard Producing Company) is in the business of producing cardboard boxes. Recently the company organized a contest for kids for the best design of a cardboard box and selected M winners. There are N prizes for the winners, each one carefully packed in a cardboard box (made by the ICPC, of course). The awarding process will be as follows:
- All the boxes with prizes will be stored in a separate room.
- The winners will enter the room, one at a time.
- Each winner selects one of the boxes.
- The selected box is opened by a representative of the organizing committee.
- If the box contains a prize, the winner takes it.
- If the box is empty (because the same box has already been selected by one or more previous winners), the winner will instead get a certificate printed on a sheet of excellent cardboard (made by ICPC, of course).
- Whether there is a prize or not, the box is re-sealed and returned to the room.
Input
The first and only line of the input file contains the values of
N
and
M
(

Output
The first and only line of the output file should contain a single real number: the expected number of prizes given out. The answer is accepted as correct if either the absolute or the relative error is less than or equal to 10
-9
.
Example(s)
sample input | sample output |
5 7 | 3.951424 |
sample input | sample output |
4 3
| 2.3125
|
比较简单的概率题目,直接可以推出公式,每个物品不被选取的概率为pow(1-1/n,m),因此被选取的概率为1-pow(1-1/n,m)
因此期望为(1-pow(1-1/n,m))*n;
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
double n,m;
int main()
{
while(~scanf("%lf%lf",&n,&m))
{
double ans=n*(1-pow(1-1/n,m));
printf("%0.9lf\n",ans);
}
return 0;
}
概率dp也可以做
dp[i]表示算到第i个人时得到物品的期望,dp[i]=dp[i-1]+(n-dp[i-1])/n,即上一状态的期望,加上这个人可以得到的物品的期望。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#define maxn 100005
using namespace std;
double n;
int m;
double dp[maxn];
int main()
{
while(~scanf("%lf%d",&n,&m))
{
dp[0]=0;
for(int i=1;i<=m;i++)
{
dp[i]=dp[i-1]+(n-dp[i-1])/n;
}
printf("%0.9lf\n",dp[m]);
}
return 0;
}