HDU 2006'10 ACM contest的颁奖晚会隆重开始了!
为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动,这个活动的具体要求是这样的:
首先,所有参加晚会的人员都将一张
写有自己名字的字条放入抽奖箱中;
然后,待所有字条加入完毕,每人从箱中取一个字条;
最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
大家可以想象一下当时的气氛之热烈,毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀!不过,正如所有试图设计的喜剧往往以悲剧结尾,这次抽奖活动最后竟然没有一个人中奖!
我的神、上帝以及老天爷呀,怎么会这样呢?
不过,先不要激动,现在问题来了,你能计算一下发生这种情况的概率吗?
不会算?难道你也想以悲剧结尾?!
为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动,这个活动的具体要求是这样的:
首先,所有参加晚会的人员都将一张
写有自己名字的字条放入抽奖箱中;
然后,待所有字条加入完毕,每人从箱中取一个字条;
最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
大家可以想象一下当时的气氛之热烈,毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀!不过,正如所有试图设计的喜剧往往以悲剧结尾,这次抽奖活动最后竟然没有一个人中奖!
我的神、上帝以及老天爷呀,怎么会这样呢?
不过,先不要激动,现在问题来了,你能计算一下发生这种情况的概率吗?
不会算?难道你也想以悲剧结尾?!
1 2
50.00%
题解:该问题为一个概率问题,分数中,分母很好确定,即是n个元素的自由组合,种数为n的阶乘,而分子则需要构建递归式来求出,假设f(n)代表分子,即n个元素放在n个位置上,但编号与其位置不对应的所有可能。现在考虑如何从f(n-1)或者f(n-2)递归求出f(n)。
假设原有A,B,C,D...Z等n个正好按对应位置排列的元素,提出第n个元素Z并覆盖前面的任一元素xx,那么此时如果想所有元素编号与其位置不对应,进行重排列时,便要分为两类:
1.如果元素xx放在元素Z的对应位置,那么剩下的n-2个元素都能与剩下的n-2个位置对应,则有f(n-2)中可能
2.如果元素xx不放在元素Z对应位置,那么剩下的n-1个元素中有一个元素xx不和任何位置对应,有一个位置不与任何元素对应,则计算知有f(n-1)中可能。所以代码如下:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
int n,i,j,k;
double b=1;//a分子,b分母
double a[21];
double bili;
a[1]=0; //初始化
a[2]=1;
for(i = 3;i < 22;i++)
a[i] = (i - 1) * (a[i-1] + a[i-2]);
scanf("%d",&n); //测试实例个数
for(i = 0;i < n;i++)
{
scanf("%d",&k);//读入整数
for(j = 1;j <= k;j++)
{
b=b * j;
}
// printf("%.2lf\n",b);
bili = a[k]/b*100;
printf("%.2lf%%\n",bili);
b = 1;
}
return 0;
}