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,所以还是稳妥一些好。
方法:数学
思路:说实话,这个题出得不太清晰,看到网上的一些解释才算是弄懂了题意。题目意思是,给你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); } }
相关文章推荐
- plsql 去除logon选择框
- 2016校招心得体会
- Java文件读写
- 数组名与指针
- VIM下,在文件及目录中查找字符串的方法 (vimgrep)
- 深度优先搜索(DFS)详解
- 异常处理:使用UTF-8编码Mysql仍然抛出Incorrect string value异常
- hdu 5491
- 二叉树转换成双向链表
- RHCS+Conga+iSCSI+CLVM+GFS实现Web服务的共享存储HA集群
- win7+VS2012下openGL开发环境配置(glut版)
- 移动端重构系列7——滚动
- 二叉排序(查找)树的调整
- 利用epoll统一调度信号、定时器和事件
- LeetCode题解——Convert Sorted Array to Binary Search Tree
- hdu2612Find a way bfs
- Axure在Windows系统下的安装
- Jenkins TFS配置
- (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
- .NET小笔记-NPOI读取excel内容到DataTable