您的位置:首页 > 其它

2200:Eddy's AC难题

2015-09-30 16:14 204 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2200

方法:数学

思路:说实话,这个题出得不太清晰,看到网上的一些解释才算是弄懂了题意。题目意思是,给你n个人,先在其中选出一部分人,然后再把他们分成两组,问有多少种分法。其中题目中所说的分数要求在我看来基本没用,因为你根本不知道所有人的成绩,我们就假设成绩是排序好的,然后按照次序取人就可以了。这样的话,不难看出,首先在n个人里取人数可以从2人一直全部取到,不能取1人,因为后面还有分成两组呢!这就是c(n,m),然后在这些人中分两组,因为假设数列有序,所以这要所以在这组序列的插入一个挡板,分成两组,就可以了。m个数,一共有m-1的空隙,那么就有m-1种方案。

难点:本题虽说编码不难,但是数学的思维还是很有锻炼的!另外,我在这里用了double类型,主要是担心阶乘运算会轻松爆掉int,所以还是稳妥一些好。

#include<iostream>
#include<cstdio>
using namespace std;
double fac(int x)
{
double ans = 1;
for(double i = 1;i <= x;i++)
ans *= i;
return ans;
}
double cal_C(int n,int m)
{
return fac(n)/(fac(n-m)*fac(m));
}
int main()
{
int n;
while(cin>>n)
{
double sum = 0.0;
for(int i = 2;i <= n;i++)
sum += (i-1)*cal_C(n,i);
printf("%.0f\n",sum);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: