区间相交问题 给定x轴上的n个闭区间,去掉尽可能少的闭区间,使得剩下的闭区间都不相交。对于给定的n个闭区间,计算去掉的最少的闭区间数。 输入描述:对于每组输入数据,输入数据的第一行是正整数n(1<=n<=40000),表示闭区间数,在接下来的n行中,每行有两个整数,分别表示闭区间的两个端点。 输出描述:输出计算出的去掉的最少闭区间数。 输入样例: 3 10 20 15 10 20 15 样例输出: 2用贪心算法实现
时间: 2024-03-30 08:39:37 浏览: 157
可以按照区间右端点从小到大进行排序,然后依次遍历每个区间,如果发现当前区间与前面的区间有重叠,则选择去掉右端点靠后的那个区间。具体实现可以使用vector存储每个区间,然后根据区间右端点排序,遍历vector,使用一个变量记录当前最右端点,如果当前区间的左端点大于等于当前最右端点,则说明当前区间与前面的区间没有重叠,将当前区间的右端点更新为当前最右端点;否则,将当前区间去掉右端点靠后的那一部分。最后剩下的区间即为不相交的区间,其个数即为去掉的区间数。
C++代码如下:
相关问题
区间相交问题: 问题描述: 给定x轴上n个闭区间,去掉尽可能少的闭区间,使剩下的闭区间都不相交。注意:这里,若区间与另一区间之间仅有端点是相同的,不算做区间相交。如,[1,2]和[2,3]算是不相交区间;给出解题分析及算法设计
这是一个经典的区间调度问题,可以使用贪心算法来解决。具体步骤如下:
1. 对于给定的n个闭区间,按照右端点从小到大排序,若右端点相等则按照左端点从小到大排序。
2. 遍历排序后的区间,选择第一个区间,将其加入到一个集合中,表示已选择的不相交区间集合。
3. 对于后续的每个区间,如果其与集合中的最后一个区间不相交,则将其加入到集合中。
4. 如果其与集合中的最后一个区间相交,则选择其中右端点更小的区间加入到集合中。
5. 重复步骤3和步骤4,直到遍历完所有的区间。
6. 返回集合中的区间作为结果。
时间复杂度为 O(nlogn),主要是排序的时间复杂度。
算法的正确性可以通过贪心选择性质来证明,即每次选择右端点最小的区间,可以使得剩余区间的右端点更大,从而容纳更多的不相交区间。
代码实现如下(使用Python语言):
给定 $x$ 轴上 $n$ 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。 给定 $n$ 个闭区间,计算去掉的最少闭区间数。c++
这是一个经典的贪心问题,可以按照区间右端点排序,然后从左往右遍历每个区间,如果当前区间与前一个区间相交,则删除右端点更靠左的区间。以下是C++代码实现:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Interval {
int left;
int right;
};
bool cmp(const Interval& a, const Interval& b) {
return a.right < b.right;
}
int minIntervals(vector<Interval>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int count = 1;
int lastRight = intervals[0].right;
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i].left >= lastRight) {
count++;
lastRight = intervals[i].right;
}
}
return intervals.size() - count;
}
int main() {
vector<Interval> intervals = {{1, 4}, {3, 5}, {2, 6}, {5, 7}, {6, 8}, {8, 10}};
cout << minIntervals(intervals) << endl; // 输出2
return 0;
}
```
阅读全文