杭电 HDU ACM 2068 RPG的错排

RPG的错排

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8489    Accepted Submission(s): 3465


Problem Description
今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;......可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。
 

Input
输入的数据里有多个case,每个case包括一个n,代表有几个女生,(n<=25), n = 0输入结束。
 

Sample Input
 
   
1 2 0
 

Sample Output
 
   
1 1
 

Author
Rabbit
 

Source
RPG专场练习赛
 
今天 遇见了 三个错排!!!!难度明显递增啊,但万变不离其宗!
注意这次是 答对一半或着一半以上才算过关!!从反面想,因为问的是方法数,当答对一半的时候,这一半人和名字一一对应,剩下的一半名字和人错排即可,同理答对n/2+1个人的时候,那么剩下的错排……依次进行相加。注意终止条件是当答对n-1个人的时候 剩的那个人错排为0,因此必然答对,但是终止条件符合题意,最后加过sum+1 啊!!欠忽视!
错的没变数,最后拿笔比划了一下。阶乘还可以这样算,如下C函数所示。注意double 既保证了数据的结果,又保证了数据范围
 
AC:
#include
#include
using namespace std;

double C(int n,int m)
{
	double sum=1,i,j;
	for(i=n,j=m;j>=1;i--,j--)
	sum*=i/j;
	return sum;
}
int main()
{
	int ls[26]={0,0,1};
	for(int k=3;k<26;k++)
		ls[k]=(k-1)*(ls[k-1]+ls[k-2]);
	int n;
	while(cin>>n,n)
	{
		if(n==1||n==2||n==3)
		{
			cout<<1<1;t--)
		s+=C(n,t)*ls[t];
		printf("%.0lf\n",s+1);
	}
	return 0;
}

当时错误代码。只能算到20的阶乘 中间就越界了、
#include
#include
using namespace std;
int main()
{
	_int64 ls[30]={0,0,1};
	_int64 gq[30]={1,1,2};
	for(int i=3;i<26;i++)
	{
		ls[i]=(i-1)*(ls[i-1]+ls[i-2]);
		gq[i]=gq[i-1]*i;
	}
	int n;
	while(cin>>n,n)
	{
		_int64 sum=0;
		if(n==1||n==2||n==3)
		{
			cout<<1<1;k--)
		sum+=gq[n]/(gq[k]*gq[n-k])*(ls[k]);
		
	printf("%I64d\n",sum+1);
	
	}
	return 0;
}


 

你可能感兴趣的:(acm水题题解)