需求描述与分析
问题背景: 张家、江家、李家各有三个孩子,某天一起参加跑步比赛。规则是第一名得 9 分,第二名 8 分,以此类推,第九名 1 分。
已知条件:
- 三家孩子的分数总和相同。
- 第一名是江家的孩子,第二名是张家的孩子。
- 各家内部的名次没有并列,且名次不相连(例如江家有第一,就不能有第二)。
目标: 找出第九名是谁家的孩子。
数学推导思路
先算一下总分:(9+8+7+6+5+4+3+2+1) = 45 分。既然三家总分相同,那每家就是 45 / 3 = 15 分。
接下来分析具体分配:
- 江家已有 9 分(第一名),剩下两人名次分数之和需为 6。可能的组合是 (5,1) 或 (4,2)。
- 张家已有 8 分(第二名),剩下两人名次分数之和需为 7。可能的组合是 (6,1)、(5,2) 或 (4,3)。
光靠手推容易漏掉约束条件,特别是'名次不相连'这一条。咱们直接写个 Python 脚本,把符合条件的排列都跑出来,这样最稳妥。
Python 代码实现
这段代码利用 itertools 库生成组合,并加入总分和连续排名的校验逻辑。
import itertools
def solve_race():
# 所有名次对应的分数:1 名=9 分,9 名=1 分
ranks = [1, 2, 3, 4, 5, 6, 7, 8, 9]
scores = {r: 10 - r for r in ranks}
# 遍历所有可能的分组方式
# 先从 9 个名次里选 3 个给江家
for jiang_ranks in itertools.combinations(ranks, 3):
# 江家必须包含第 1 名(分数 9)
if 1 not in jiang_ranks:
continue
# 计算江家总分
jiang_score = sum(scores[r] for r in jiang_ranks)
if jiang_score != :
sorted_jiang = (jiang_ranks)
(sorted_jiang[i+] - sorted_jiang[i] == i ()):
remaining = [r r ranks r jiang_ranks]
zhang_ranks itertools.combinations(remaining, ):
zhang_ranks:
zhang_score = (scores[r] r zhang_ranks)
zhang_score != :
sorted_zhang = (zhang_ranks)
(sorted_zhang[i+] - sorted_zhang[i] == i ()):
li_ranks = (r r remaining r zhang_ranks)
li_score = (scores[r] r li_ranks)
li_score != :
sorted_li = (li_ranks)
(sorted_li[i+] - sorted_li[i] == i ()):
()
__name__ == :
solve_race()

