讨厌鬼的区间
[题目链接](https://www.nowcoder.com/practice/cd73e5d3f95949fb9664b26b0078b229)
思路
有三个区间 、
、
。两个人分别选择不同的区间,然后各自在自己的区间内选一个数,要求所选的数也必须在对方的区间内,使两数之和最大。
关键观察
两个人选了区间 和区间
(
)后,他们各自选的数必须同时属于两个区间,即必须落在交集
中。
为了让两数之和最大,两人都应选交集中的最大值 ,此时和为
。
如果交集为空(即 ),则该组合无效。
枚举所有组合
三个区间中选两个不同的,共 种组合。对每种组合计算交集,若非空则记录
,取所有有效组合的最大值即可。若没有任何有效组合,输出
。
样例演示
三个区间为 、
、
:
- 区间 1 和区间 2:交集
,和
- 区间 1 和区间 3:交集为空(
),跳过
- 区间 2 和区间 3:交集
,和
最大值为 。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int a[3], b[3];
for(int i=0;i<3;i++) cin>>a[i]>>b[i];
int ans = -1;
for(int i=0;i<3;i++){
for(int j=i+1;j<3;j++){
int lo = max(a[i],a[j]);
int hi = min(b[i],b[j]);
if(lo<=hi){
ans = max(ans, 2*hi);
}
}
}
cout << ans << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] a = new int[3], b = new int[3];
for (int i = 0; i < 3; i++) {
a[i] = sc.nextInt();
b[i] = sc.nextInt();
}
int ans = -1;
for (int i = 0; i < 3; i++) {
for (int j = i + 1; j < 3; j++) {
int lo = Math.max(a[i], a[j]);
int hi = Math.min(b[i], b[j]);
if (lo <= hi) {
ans = Math.max(ans, 2 * hi);
}
}
}
System.out.println(ans);
}
}
nums = list(map(int, input().split()))
a = [nums[0], nums[2], nums[4]]
b = [nums[1], nums[3], nums[5]]
ans = -1
for i in range(3):
for j in range(i+1, 3):
lo = max(a[i], a[j])
hi = min(b[i], b[j])
if lo <= hi:
ans = max(ans, 2 * hi)
print(ans)
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', (line) => {
const nums = line.trim().split(/\s+/).map(Number);
const a = [nums[0], nums[2], nums[4]];
const b = [nums[1], nums[3], nums[5]];
let ans = -1;
for (let i = 0; i < 3; i++) {
for (let j = i + 1; j < 3; j++) {
const lo = Math.max(a[i], a[j]);
const hi = Math.min(b[i], b[j]);
if (lo <= hi) {
ans = Math.max(ans, 2 * hi);
}
}
}
console.log(ans);
rl.close();
});
复杂度分析
- 时间复杂度:
。只有 3 个区间,枚举组合数为常数
。
- 空间复杂度:
。只用了常数个变量。

京公网安备 11010502036488号