伴学笔记|青训营X豆包MarsCode 技术训练营

48 阅读4分钟

问题描述

小C和小U一直相互喜欢着,今天他们终于有机会表达对彼此的心意。

小C有三个区间:[l_1, r_1][l_2, r_2], 和 [l_3, r_3]。小C和小U将分别从这些区间中选择一个自己最喜欢的区间,但这两个区间不能相同。

接着,他们会在自己喜欢的区间内选择一个数,并且这个数还要能够在对方的区间内找到。为了讨对方欢心,他们希望选择的两个数的和尽可能大。

你的任务是帮助小C和小U找到这两个数的和的最大值。如果不存在这样的两个数,输出 -1


测试样例

样例1:

输入:l1 = 1, r1 = 3, l2 = 2, r2 = 4, l3 = 4, r3 = 6
输出:8

样例2:

输入:l1 = 1, r1 = 2, l2 = 2, r2 = 3, l3 = 3, r3 = 4
输出:6

样例3:

输入:l1 = 10, r1 = 20, l2 = 15, r2 = 25, l3 = 30, r3 = 40
输出:40

以下是对上述问题的详细分析: ### 1. 问题理解 - 给定了小C拥有的三个区间 [l_1, r_1][l_2, r_2][l_3, r_3]。 - 小C和小U要分别从这三个区间中选择不同的区间,然后在各自所选区间内挑选一个数,且该数要能在对方所选区间内找到,目标是使这两个所选数字的和最大。

2. 解决思路 - 为了找到满足条件的两个数的和的最大值,需要遍历所有可能的区间组合情况(因为小C和小U要选不同区间,所以有三种选法:C选1区间U选2区间、C选1区间U选3区间、C选2区间U选3区间)。 - 对于每一种区间组合: - 首先确定小C所选区间和小U所选区间。 - 然后在小C所选区间内找到一个能在小U所选区间内存在的最大值,同时在小U所选区间内找到一个能在小C所选区间内存在的最大值。 - 将这两个最大值相加,得到当前区间组合下的两数之和。 - 比较所有区间组合下得到的两数之和,取其中的最大值作为最终结果。如果在任何区间组合下都找不到满足条件的两个数(即无法找到在对方区间内也存在的数),则最终结果为 -1 。

3. 代码实现思路(以提供的Python代码为例)

  • 输入部分: - 通过 map(int, input().split()) 将输入的六个整数(三个区间的左右端点)分别赋值给 l1r1l2r2l3r3。 - 创建了一个包含三个区间的列表 intervals,方便后续遍历不同区间组合。

    • 核心计算部分: - 使用两层嵌套的循环来遍历所有可能的区间组合情况。外层循环控制小C选择区间的索引 i,内层循环控制小U选择区间的索引 j,当 i!= j 时,表示选择了不同的区间。 - 对于每一种区间组合,通过列表索引获取对应的区间 left_interval(小C所选区间)和 right_interval(小U所选区间)。 - 然后分别在两个区间内找到满足条件的最大值: - 对于 left_interval,使用列表推导式和 max 函数找到能在 right_interval 内存在的最大值 max_val_from_left。 - 对于 right_interval,同样使用列表推导式和 max 函数找到能在 left_interval 内存在的最大值 max_val_from_right。 - 计算当前区间组合下这两个最大值的和 current_sum。 - 更新全局最大和 max_sum,使其始终保存已遍历过的区间组合中的最大两数之和。
  • 输出部分: - 最后输出 max_sum,即为满足问题要求的两个数的和的最大值,如果整个过程中都没有找到合适的数对,max_sum 将保持初始值 -1 。 通过这样的分析和实现思路,可以有效地解决给定的小C和小U选择区间内数字求和的问题。 以下为代码实现: def solution(l1: int, r1: int, l2: int, r2: int, l3: int, r3: int) -> int:

    定义一个函数来检查两个数是否在对方的区间内

    def is_valid(x, y, l1, r1, l2, r2): return l1 <= y <= r1 and l2 <= x <= r2

    初始化最大和为-1

    max_sum = -1

    遍历所有可能的区间组合

    intervals = [(l1, r1), (l2, r2), (l3, r3)] for i in range(3): for j in range(3): if i != j: l1, r1 = intervals[i] l2, r2 = intervals[j]

             # 遍历第一个区间内的所有数
             for x in range(l1, r1 + 1):
                 # 遍历第二个区间内的所有数
                 for y in range(l2, r2 + 1):
                     # 检查是否满足条件
                     if is_valid(x, y, l1, r1, l2, r2):
                         max_sum = max(max_sum, x + y)
    

    return max_sum if name == 'main': print(solution(1, 3, 2, 4, 4, 6) == 8) print(solution(1, 2, 2, 3, 3, 4) == 6) print(solution(10, 20, 15, 25, 30, 40) == 40)