HDOJ Eddy's AC难题

Eddy's AC难题
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4734 Accepted Submission(s): 2234

http://acm.hdu.edu.cn/showproblem.php?pid=2200


Problem Description
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


解析:这题我用递推写出来了,设f[n]表示结果,max[n]表示n个数中最大的;

(1)当方法中不包含max[n],是可知f1[n]==f[n-1]

(2)当方法中包含max[n]时

1)当大的一边除了max[n]还有其他数时,相当于在f[n-1]所有方法大的一边加入max[n],数量也为f[n-1]

2)当大的一边只有max[n]时, 另一边不管怎么取肯定是较小的,相当于在n-1个数之中取1、2、3、---n-1个数,

结果为C(1, n-1)+C(2, n-1)+C(3, n-1)-----+C(n-1, n-1)==2^(n-1)-C(0, n-1)==2^(n-1)-1,这一步是根据高中的知识,二项式展开可得,

例如(1+1)^2==C(0, 1)+C(1, n)+……+C(n, n)=2^n

所以f2[n]=f[n-1]+2^n-1;


所以综上所述f[n]==f1[n]+f2[n]==2*f[n-1]+2^n-1;代码实现就很简单了。


# include <iostream>
# include <math.h>
# include <stdlib.h>
using namespace std;
long long int f[500];
int main(){
	int n, i, j, k;
	while(cin>>n){
		f[2]=1;
		for(i=3; i<=n; i++){
			f[i]=2*f[i-1]+pow(2, i-1)-1;
		}
		cout<<f[n]<<"\n";
	}
	return 0;
}


你可能感兴趣的:(C++,组合,ACM,递推,二项式展开)