HDU 2048

不知道有没有同学卡在了2048

现在我来和大家分享一下思路

首先这是一道递推+错排

首先找到规律 :如果是N个人的排序,那么让第N个人第一次抽取,那么要符合题意就要有n-1种可能性。

且剩下的n-1个人的可能排序方法设为D(n-1)种可能性

第N个人是第一次抽的有两种可能性,也就是剩下的N-1个人排序是否满足于题意。

第一种可能性:如果是满足于,那么也就是说有剩下的n-1个人有D(n-1)的可能性,

第二种可能性:如果是不满足于,那么这种情况下就要考虑一种特殊情况(也就是第N个人抽取到了第M个人,第M个人也抽到了N)那么也就是剩下的N-2个人满足于排序有D(n-2)的可能性。

那么就可以推出公式D(n)={D(n-1)+D(n-2)}*(n-1)   //n-1是第n个人抽取的可能性,d(n-1),d(n-2)是两种情况下的可能性

代码如下

#include<stdio.h>

__int64 f[21],sum;
int main()
{
     int i,t,n;
     f[1]=0;f[2]=1;
     for(i=3;i<21;i++) 
         f[i]=(i-1)*(f[i-1]+f[i-2]); 
     scanf("%d",&t);
     while(t--)
     {
         scanf("%d",&n);
         sum=1;
         for(i=1;i<=n;i++)   //循环输出所有的可能性
         sum*=i;
         printf("%.2lf%%\n",f[n]*100.0/sum);


     }


 return 0;
}


猜你喜欢

转载自blog.csdn.net/xxf_is_girl_gad/article/details/80590639