握手问题求解

       本人闲暇之余,想了一个简单的数学问题,也可以说是算法问题,试想着看能不能用递归思路解决。

题目描述:

       假设有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;
}

 代码执行如下:

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值