原题传送门:1.握手问题 – 蓝桥云课
问题描述
小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手 (但这 7人与除这 7 人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手?
注意 A 和 B 握手的同时也意味着 B 和 A 握手了,所以算作是一次握手。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
问题解析:
本题刻意提醒:“注意 A 和 B 握手的同时也意味着 B 和 A 握手了,所以算作是一次握手。”,我们在解题时应该特别注意关注这些提示的字眼,其可以在一定程度上减少我们的思维量,有时题中的一些“废话”其不仅是对题目的进一步解释,更是对我们思维的一种引导。
其次,需要我们比较留意的一个点是,基本上的竞赛题都可以说实质上是个数学问题,对于那些数学味道比较浓郁的题目,我们应当要有将具体问题抽象提炼成其对应的数学问题的能力。
遇到问题不要慌(其实我也挺慌的),先来提取题中的各种信息:
- 1,总共有50人参与;
-
2,有七位参与者例外,根据题目描述,他们与“除这 7 人以外的所有人进行了握手”(这七人之间是否存在些不可告人的神秘过往?思索🤔)
-
3,待求为这些人之间一共进行了多少次握手
到这里本题的基本逻辑就理清楚了,我们尝试将其抽象成数学问题:
其实只要你数学逻辑比较到位(bushi),读到这里你应该可以很明确的感受到,本题其本质是数学中的排列组合问题
根据题中描述,50人本应该是两两之间相互握手,如果问题是这五十个人两两之间相互握手,求最后的握手次数,你应该可以很快反应过来一个数学概念:组合数!那本题是C呢还是A呢,如果你不确定,可以摇个骰子试试?思索🤔
如果此时的你对于CA问题摇摆不定,或者并不太了解组合数的详细计算方法,请点击下方链接前往哔哩哔哩大学老老实实学习完本章的前置知识:
(敲黑板!)【排列组合,20分钟从零基础到高考要求!|小姚老师】
同样的,对于这七位特立独行的人,我们可以敏锐的察觉到,对他们的处理将会成为本题的题眼!
即,针对这七个人的处理,我们可以延申出两种本题的解题方向:
- 1,正常计算的43人握手次数,加上,特立独行的7人与其他人之间的握手次数
-
2,正常计算的50人握手次数,减去,特立独行的7人之间本应该存在的握手次数
本题将采用第二种解法,至于第一种方向,希望读者可以自行进行尝试,若存在阻碍,可以点击CSDN-南徽玉的主页向博主私信,或者点击顶栏关于->关于我,联系博主。
代码描述:
在理清楚本题的基本逻辑之后,我们可以尝试着手写代码:
- 1,首先实现计算组合数的部分,如果你已经具备了解决本题的基本前置知识,那你应该可以确定,本题的关键是C!那么对于C的计算规则实现起来其实非常简单,代码如下:
# 计算组合数 C(n, 2),即从 50 人中任意选择 2 人进行握手
def comb(n):
"""计算组合数 C(n, 2)"""
return n * (n - 1) // 2
- 2,计算总的握手次数,我们使用上面提到的第二种计算方法实现:
# 计算总握手次数
def calculate_handshakes(total_people, excluded_people):
total_handshakes = comb(total_people) # 总人数之间的握手数
excluded_handshakes = comb(excluded_people) # 排除的7人之间的握手数
return total_handshakes - excluded_handshakes
- 3,设置传入的参数,调用函数,计算结果:
# 参数设置
total_people = 50
excluded_people = 7
# 计算结果
result = calculate_handshakes(total_people, excluded_people)
print(result)
对上述代码进行汇总,得到完整的代码如下:
# 计算组合数 C(n, 2),即从 50 人中任意选择 2 人进行握手
def comb(n):
"""计算组合数 C(n, 2)"""
return n * (n - 1) // 2
# 计算总握手次数
def calculate_handshakes(total_people, excluded_people):
total_handshakes = comb(total_people) # 总人数之间的握手数
excluded_handshakes = comb(excluded_people) # 排除的7人之间的握手数
return total_handshakes - excluded_handshakes
# 参数设置
total_people = 50
excluded_people = 7
# 计算结果
result = calculate_handshakes(total_people, excluded_people)
print(result)
结果提交:
执行上述代码,得到结果为:
将结果提交到官网:
写在最后
小玉认为,不管是在平时的练习之中,亦或是平时的项目开发之中,我们都应该有“变量作用如其名”的良好意识,这样不仅方便代码的阅读者,同样也可以为自身后期的排查与检验省下不少的二力气哦!
如果您在阅读本文的过程中有所收获,或者有任何宝贵的建议和想法,欢迎通过邮箱或是微信等方式给我留言交流,您的每一次建议都将是我前进的动力!在此,博主斗胆向您提出一个小小的请求,如果您觉得本文给您带来了一丝启发,不妨动动手指,给予一点点鼓励。万水千山总是情,您的打赏,哪怕只是 0.1 元,也是对博主莫大的支持!(悄悄告诉您,博主正在为服务器众筹中 (×﹏×),您的每一份心意都将助力博主走得更远!)感谢您的慷慨,愿我们的缘分如同这网络世界,绵长不断