不知道有没有同学卡在了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;
}