HDU 2200 Eddy's AC难题

Eddy's AC难题

  Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目的数量摘录下来,然后从中选择一部分人(或者全部)按照ac的数量分成两组进行比较,他想使第一组中的最小ac数大于第二组中的最大ac数,但是这样的情况会有很多,聪明的你知道这样的情况有多少种吗? 

  特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数范围内. 

Input

  输入包含多组数据,每组包含一个整数n,表示从Ranklist上摘录的总人数。 
Output

  对于每个实例,输出符合要求的总的方案数,每个输出占一行。 
Sample Input

2
4

Sample Output

1
17

解题思路:
  本题有多组测试,给出一个整数n为从Rank上摘录的人数,将摘录的人分为两组,其中一组的所有人的AC数大于另一组,保证每个人的AC数都不一致。

  选出了n人,但是在分组时不一定将所有人都分组,所以我们m从2 ~ n选择分组人数,选择的种数可以用组合数计算得到,将选出的所有人按AC数量排序,若将一组个数为m有序数拆分为两组,使其中一组的所有值大于另一组,可以在每两个数中间进行拆分这样便是求间隔的个数即为n-1。

排列组合相关运算

样例分析:

2:

挑出2个数有2! / ((2 - 2)! * 2!) = 2 / (1 * 2) = 1

2个数分为两组有1种情况,答案 = 1 * 1 = 1

4:

挑出2个数有 4! / ((4 - 2)! * 2!) = 6

2个数分为两组有1种情况 挑出2个数时所有分组情况为6 * 1 = 6;

挑出3个数有 4! / ((4 - 3)! * 3! = 4

3个数分为两组有3 - 1 = 2种情况 挑出3个数时所有分组情况为4 * 2 = 8

挑出4个数有 4! / ((4 - 4)! * 4!) = 1

4个数分为两组有4 - 1 = 3种情况 挑出4个数时所有分组情况为1 * 3 = 3

答案 = 6 + 8 + 3 = 17

AC代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL clt(int n){
 5     LL ans = 0; //初始化答案为0
 6     for(int i = 2; i <= n; i++){    //从2个到n个挑出数字
 7         LL temp = 1;
 8         for(int j = 1; j <= i; j++){    //计算组合数
 9             temp = temp * (n - j + 1) / j;
10         }
11         ans += temp * (i - 1);  //计算答案
12     }
13     return ans;
14 }
15 int main()
16 {
17     int n;
18     while(scanf("%d", &n) != EOF){  //输入摘录人数
19         if(n < 2){ //人数小于2无法分为两组输出0
20             printf("0\n");  
21             continue;
22         }
23         LL ans = clt(n);    //人数大于2计算答案
24         printf("%lld\n", ans);
25     }
26     return 0;
27 }

 

posted @ 2018-11-23 14:30  suvvm  阅读(230)  评论(0编辑  收藏  举报