小C和小U
问题描述
小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
问题分析
此问题是区间交集问题,要求找出三个区间中任意两个区间的交集的最大值,并计算相应的和。
在给定的三个区间 [l1, r1], [l2, r2], [l3, r3] 中挑选出两个不相同的区间,使得它们的交集非空,在交集区间中选择一个数,使得两个选择的数之和最大。
step1:求任意两个区间 [l1, r1] 和 [l2, r2] 区间交集:
- 交集的左端点是
max(l1, l2),交集的右端点是min(r1, r2)。
- 如果
max(l1, l2) <= min(r1, r2),交集存在,交集的最大值为min(r1, r2)。
- 如果
max(l1, l2) > min(r1, r2),交集不存在。
具体实现:定义交集计算函数, 定义auto getIntersectionMax = [](int a1, int b1, int a2, int b2) {...},采用 Lambda 表达式的基本结构。auto 关键字:表示编译器自动推导 lambda 表达式的返回类型。getIntersectionMax 是 lambda 表达式的名称。[](int a1, int b1, int a2, int b2) {...} 是 lambda 表达式的主体部分。来计算两个区间的交集最大值。
step2:计算最大和:
对于每一对区间交集存在的情况,选择交集区间中的最大值,计算两个数的和。目标是选取两个区间的交集并使其和最大。maxSum = max(maxSum, inter1 + inter1);
step3:考虑所有可能的区间组合:
有三个区间 [l1, r1], [l2, r2], [l3, r3],
可以通过循环枚举的方式,遍历所有组合,检查所有可能的两两区间组合,计算交集并更新最大和。
返回结果,计算交集的最大值和其自身的和,比较所有可能组合的和,输出最大值。最终输出最大和,如果没有找到交集,则输出 -1。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int solution(int l1, int r1, int l2, int r2, int l3, int r3) {
int maxSum = -1;
// 检查区间 [a1, b1] 和 [a2, b2] 是否有交集
auto getIntersectionMax = [](int a1, int b1, int a2, int b2) {
int a = max(a1, a2);
int b = min(b1, b2);
if (a <= b) return b;
return -1; // 如果没有交集,返回 -1
};
//[l1, r1] 和 [l2, r2]
int inter1 = getIntersectionMax(l1, r1, l2, r2);
if (inter1 != -1) {
maxSum = max(maxSum, inter1 + inter1);
}
//[l1, r1] 和 [l3, r3]
int inter2 = getIntersectionMax(l1, r1, l3, r3);
if (inter2 != -1) {
maxSum = max(maxSum, inter2 + inter2);
}
//[l2, r2] 和 [l3, r3]
int inter3 = getIntersectionMax(l2, r2, l3, r3);
if (inter3 != -1) {
maxSum = max(maxSum, inter3 + inter3);
}
return maxSum; // 返回最大和,如果没有找到交集返回 -1
}
int main() {
// 测试样例
cout << (solution(1, 3, 2, 4, 4, 6) == 8) << endl; // 8
cout << (solution(1, 2, 2, 3, 3, 4) == 6) << endl; // 6
cout << (solution(10, 20, 15, 25, 30, 40) == 40) << endl; // 40
}