您的位置:首页 > 编程语言

【基础编程】HDOJ2048神、上帝以及老天爷

2016-10-19 11:14 281 查看


这个题目没有想出来,最后不得不看了别人的结题报告。知道了这是一个关于错排的题目,有根据别人的思路,推到了一下公式,才开始自己实现代码。反正我一见到排列组合的题目脑袋就会一团浆糊,可能高中时候就没有学好。

现在整理一下这个题目的思路:

假设前n-1个都已经是错排了,总共有f(n-1)种。那么,把第n个放到这个错排中,会有两种情况:

第一:与n的位置交换。假设将第n个元素放在某一位置m,m位置的元素放在n的位置。这样的方法有(n-1)*f(n-1)种

第二:与n交换后的m位置的元素不放在n的位置。这样的方法有(n-1)*f(n-2)中

所以,总共有(n-1)*(f(n-1)*f(n-2))种方法。

实现代码如下:

#include<stdio.h>
double a[100] = {0};

double f(int n)
{

if(n == 1)
{
a
= 0;
return 0;
}
else if(n == 2)
{
a
= 1;
return 1;
}
else
{
if(a[n-1] && a[n-2])
return (n-1)*(a[n-1] + a[n-2]);
else
{
a
= (n-1)*(f(n-1) + f(n-2));
return a
;
}
}

}

long long b(int n)
{
if(n == 1)
return 1;
else
return n*b(n-1);
}

int main(void)
{
int n,i,m;
while(scanf("%d",&n) != EOF)
{
for(i = 0;i < n;i++)
{
scanf("%d",&m);
printf("%.2f%c\n",(f(m)/b(m))*100,37);
}
}

return 0;
}


这是从网上看到的简单代码:

#include <stdio.h>
int main()
{
int i,n,m;
double a[21]={0,0,1};
double  b[21]={1,1,2};
for(i=3;i<=21;i++)
{
a[i]=(a[i-1]+a[i-2])*(i-1);
b[i]=b[i-1]*i;
}
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%.2lf%%\n",a[m]/b[m]*100);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: