握手问题求解

本人闲暇之余,想了一个简单的数学问题,也可以说是算法问题,试想着看能不能用递归思路解决,目前还未能想出递归的思路,聪明的你能告诉我如何解决吗?

 

题目描述:

假设有n个人,两两握手(与除自己外的所有人握手),每两个不同的人能且仅能握手1次,一次握手按1秒钟计算(每个人同一时间只能与1个人握手)。求n=49时,所有人都与其他人握完手所用的最短时间?n=10241023 呢?

欢迎各位大佬分享思路!

题目分析:

经过些许思考,该问题运用递归思想比较容易解决。假设有n个人握手,将n个人平均分为A、B两组(若n为奇数,则分为(n+1)/2和(n-1)/2),这两组人相互握手,A组每个人保证与B组所有人都握手,同样B组每个人都保证与A组所有人都握手,这样两组人握完手用时最短:当n为偶数最短n/2秒,n为奇数最短(n+1)/2秒。此时A、B两组只有组内未完成握手,假设组内人数:A>=B,及A组内握完手所用时间B组肯定也能握完手,只需考虑人多的那一组握完手时间,将A组再分为两组,按照上述思路递归……

代码实现简单如下:

#include 

int totaltime = 0;

void woshou(int iPeople)
{
	if(iPeople == 2)
	{
		totaltime += 1;
	}
	else
	{
		int iNum = (iPeople%2 == 0 ? iPeople/2 : (iPeople + 1)/2);
		
		totaltime += iNum;
		
		woshou(iNum);
	}
	
}


int main()
{
	int iPeople = 49;
	
	woshou(iPeople);
	
	printf("%d 人相互握完手最少用时:%d min\n", iPeople, totaltime);
	
	return 0;
}

 代码执行如下:

握手问题求解_第1张图片

 

 

你可能感兴趣的:(算法)