本人闲暇之余,想了一个简单的数学问题,也可以说是算法问题,试想着看能不能用递归思路解决。
题目描述:
假设有n个人,两两握手(与除自己外的所有人握手),每两个不同的人能且仅能握手1次,一次握手按1秒钟计算(每个人同一时间只能与1个人握手)。求n=49时,所有人都与其他人握完手所用的最短时间?n=10241023 呢?
欢迎各位大佬分享思路!
题目分析:
经过些许思考,该问题运用递归思想比较容易解决。
假设有n个人握手,将n个人平均分为A、B两组(若n为奇数,则分为(n+1)/2和(n-1)/2),这两组人相互握手,A组每个人保证与B组所有人都握手,同样B组每个人都保证与A组所有人都握手,这样两组人握完手用时最短情况分为以下情况:
1、当n为偶数最短n/2秒;
2、n为奇数最短(n+1)/2秒。
此时A、B两组只有组内未完成握手,假设组内人数:A>=B,及A组内握完手所用时间B组肯定也能握完手,只需考虑人多的那一组握完手时间,将A组再分为两组,按照上述思路递归……
代码实现简单如下:
#include <stdio.h> 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; }
代码执行如下: