神、上帝以及老天爷
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10162 Accepted Submission(s): 4335
http://acm.hdu.edu.cn/showproblem.php?pid=2048
Problem Description
HDU 2006'10 ACM contest的颁奖晚会隆重开始了!
为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动,这个活动的具体要求是这样的:
首先,所有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;
然后,待所有字条加入完毕,每人从箱中取一个字条;
最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
大家可以想象一下当时的气氛之热烈,毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀!不过,正如所有试图设计的喜剧往往以悲剧结尾,这次抽奖活动最后竟然没有一个人中奖!
我的神、上帝以及老天爷呀,怎么会这样呢?
不过,先不要激动,现在问题来了,你能计算一下发生这种情况的概率吗?
不会算?难道你也想以悲剧结尾?!
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(1<n<=20),表示参加抽奖的人数。
Output
对于每个测试实例,请输出发生这种情况的百分比,每个实例的输出占一行, 结果保留两位小数(四舍五入),具体格式请参照sample output。
Sample Input
1
2
Sample Output
50.00%
分析:n个人抽奖总共可以抽到n的阶乘种情况,要的到全部错序的情况需要用总情况减去有人中奖情况的所有可能性,所以得到递推公式:
这里假设f(n)为当n个人时总共有几种错需排列情况。
C(n,x) = n * (n-1)*(n-2).....*(n- x+1) / x * (x-1)*(x-2).....*(1);
就是一个数学表达式,不会打印所以用上面的形式表示了。
f(n) = C(n,1)f(n-1)- C(n,2)f(n-2)-C(n,3)f(n - 3) ...... - C(n,n-2)f(2) - 1;
得到代码如下:
#include <stdio.h>
#include <string.h>
int num[7];
int cNum(int top,int bottom)
{
int nTop = 1;
int nBottom = 1;
int i;
for(i = bottom;i>=1;i--)
{
nBottom = nBottom * i;
}
for(i = top;i>top-bottom;i--)
{
nTop = nTop * i;
}
return nTop / nBottom;
}
int fib(int n)
{
int i,sum=1,sumSub=0,bottom;
if(n == 1 || n == 2)
{
return n - 1;
}
if(num[n] != 0)
{
return num[n];
}
for(i = n;i>=1;i--)
{
sum = sum * i;
}
bottom = n - 2;
for(i = 1;i<=bottom;i++)
{
sumSub = sumSub + cNum(n,i) * fib(n-i);
}
return num[n] = sum - sumSub - 1;
}
int main()
{
int count,n,i,sum;
double rate;
while(scanf("%d",&count)!=EOF)
{
while(count--)
{
scanf("%d",&n);
if(n < 7)
{
sum = 1;
for(i = n;i>=1;i--)
{
sum = sum * i;
}
memset(num,0,7);
rate = fib(n)/(sum+0.0);
printf("%.2lf%%\n",rate*100);
}else
{
printf("36.79%%\n");
}
}
}
return 0;
}
由于当人数为7个或以上是概率趋于稳定值,所以这里就不用计算了,直接输出。
另外,看了下别人的代码觉得这个分析很好,如下:
N张票的所有排列可能自然是Ann = N!种排列方式
现在的问题就是N张票的错排方式有几种。
首先我们考虑,如果前面N-1个人拿的都不是自己的票,即前N-1个人满足错排,现在又来了一个人,他手里拿的是自己的票。
只要他把自己的票与其他N-1个人中的任意一个交换,就可以满足N个人的错排。这时有N-1种方法。
另外,我们考虑,如果前N-1个人不满足错排,而第N个人把自己的票与其中一个人交换后恰好满足错排。
这种情况发生在原先N-1人中,N-2个人满足错排,有且仅有一个人拿的是自己的票,而第N个人恰好与他做了交换,这时候就满足了错排。
因为前N-1个人中,每个人都有机会拿着自己的票。所以有N-1种交换的可能。
综上所述:f(n) = (i - 1) * [f(n - 1) + f(n - 2)]
#include <math.h>
#include <stdio.h>
int main(void)
{
int i, n;
__int64 d[21][2] = {{1,0},{1,0},{2,1},{6,2}};
for (i = 4; i < 21; i++)
{
d[i][0] = i * d[i-1][0];
d[i][1] = (i - 1) * (d[i-1][1] + d[i-2][1]);
}
scanf("%d", &n);
while (n-- && scanf("%d", &i))
printf("%.2f%%\n", d[i][1]*100.0/d[i][0]);
return 0;
}
分享到:
相关推荐
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
8. **图论与树**:HDU题目中可能涉及图的遍历(深度优先搜索DFS、广度优先搜索BFS)、树的遍历(前序、中序、后序)以及最小生成树、最短路径等算法。 9. **动态规划**:这是一种优化策略,通过构建状态转移方程来...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...
ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...
【标签】"DP HDU"强调了这道题目与动态规划(DP)以及HDU在线判题系统的关系。动态规划是一种通用的算法技巧,适用于多种问题,而HDU标签则表明这是该平台上的一个挑战。 【压缩包子文件的文件名称列表】:"DP"可能...
HDU1059的代码
蟠桃记 1 折线分割平面 2 不容易系列之一 2 骨牌铺方格 3 不容易系列之(3)—— LELE的RPG难题 3 Children’s Queue 3 献给杭电五十周年校庆的礼物 3 ...神、上帝以及老天爷 3 不容易系列之(4)——考新郎 3
hdu1001解题报告
hdu 1574 passed sorce
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...
【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...
hdu2101AC代码
在HDU的在线评测系统中,每道题目都有详细的描述、输入输出格式以及限制条件,参赛者需要编写程序来满足这些要求,并提交到系统进行自动评判。 【标签】"ACM题解 HDU"意味着这是一个关于如何解答HDU ACM题目的资源...
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
同时,理解算法基础如排序(冒泡、选择、插入、快速、归并等)、查找(顺序、二分、哈希等)以及递归和动态规划等,对于解决问题至关重要。 二、数据结构篇:构建解题工具箱 数据结构是ACM竞赛中的核心部分,包括...
HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...
hdu 1166线段树代码
HDU是杭州电子科技大学(Hangzhou Dianzi University)举办的一个在线编程竞赛平台,全称为HDU Online Judge。ACM是国际大学生程序设计竞赛(International Collegiate Programming Contest)的缩写,是一个全球性的...
Hdu 1237 解题代码