2048

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2048


思路:该题运用了错排公式,即D(n)=(n-1)*(D(n-1)+D(n-2))。计算出n张字条错排给n个人的可能性(每个人得到的都非自己的字条),再除以n张字条给n个人的所有可能性,就能得出结果。

做法:建立数组a,并给a[0],a[1].a[2],a[3]分别赋值0,0,1,2.(其中1和2对应错排公式中n取到2和3的情况)。导入错排公式,因为题目中限定的n并不大,所以可以先计算出n<21时的所有错排种数。然后定义一个b,用for循环计算排列组合的总数,即b!。最后因为要输出百分数,因此输出100*a[x]/b。(因为要输出百分号,所以双引号中需要增加%%)


总结:排列组合是我的弱项,包括错排公式也是在思考了一个小时后推不出而百度来的。具体推导如下:

将n个元素的错排定义为D(n),那么n-1个元素的错排为。D(n-1),n-2个的为D(n-2),以此类推。

将第n个元素取出,那么第n个位置就空了。将第m个元素取出,再将第n个元素放进第m个元素的位置上。那么现在第m个元素有两种去处。

第一,将它放在第n个位置上,即事实上是第n个元素和第m个元素互换位置,那么对于剩下的n-2个元素,错排方式为D(n-2),因此该种情况的错排方式为(n-1)D(n-2)。

第二,将它放在除了n和m的任一位置上,那么对于剩下的n-2个元素以及m,错排方式为D(n-1),因此该种情况的错排方式为(n-1)D(n-1)。

所以,可以推导出错排公式D(n)=(n-1)*(D(n-1)+D(n-2))。

在我自己推导的过程中,经常因为对自己所列举的错排的种类数抱有怀疑而有点停滞不前,也确实常有考虑不周全的地方,导致最后没把公式推导出来。虽然最后是借助百度理解错排公式,但是学到了新的东西,总归是好的。

你可能感兴趣的:(2048)