区间相交问题 给定x轴上的n个闭区间,去掉尽可能少的闭区间,使得剩下的闭区间都不相交。对于给定的n个闭区间,计算去掉的最少的闭区间数。 输入描述:对于每组输入数据,输入数据的第一行是正整数n(1<=n<=40000),表示闭区间数,在接下来的n行中,每行有两个整数,分别表示闭区间的两个端点。 输出描述:输出计算出的去掉的最少闭区间数。 输入样例: 3 10 20 15 10 20 15 样例输出: 2用贪心算法实现
时间: 2024-03-30 22:39:37 浏览: 12
可以按照区间右端点从小到大进行排序,然后依次遍历每个区间,如果发现当前区间与前面的区间有重叠,则选择去掉右端点靠后的那个区间。具体实现可以使用vector存储每个区间,然后根据区间右端点排序,遍历vector,使用一个变量记录当前最右端点,如果当前区间的左端点大于等于当前最右端点,则说明当前区间与前面的区间没有重叠,将当前区间的右端点更新为当前最右端点;否则,将当前区间去掉右端点靠后的那一部分。最后剩下的区间即为不相交的区间,其个数即为去掉的区间数。
C++代码如下:
相关问题
给定 $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;
}
```
区间相交问题 给定x轴上的n个闭区间,去掉尽可能少的闭区间,使得剩下的闭区间都不相交。对于给定的n个闭区间,计算去掉的最少的闭区间数。 输入描述:对于每组输入数据,输入数据的第一行是正整数n(1<=n<=40000),表示闭区间数,在接下来的n行中,每行有两个整数,分别表示闭区间的两个端点。 输出描述:输出计算出的去掉的最少闭区间数。 输入样例: 3 10 20 15 10 20 15 样例输出: 2编写完整代码用贪心算法实现
这道题可以用贪心算法。首先按照区间右端点从小到大排序,然后从左到右扫描所有区间,只要当前区间与前一个区间不相交,则保留当前区间,否则去掉当前区间。最后剩下的区间数就是最少去掉的区间数。
下面是Python代码实现:
```python
n = int(input())
intervals = []
for i in range(n):
l, r = map(int, input().split())
intervals.append((l, r))
intervals.sort(key=lambda x: x[1]) # 按右端点排序
cnt = 1
last_end = intervals[0][1]
for i in range(1, n):
if intervals[i][0] > last_end: # 当前区间与前一个区间不相交
cnt += 1
last_end = intervals[i][1]
print(n - cnt) # 去掉的区间数
```
时间复杂度为 $O(n\log n)$,因为需要排序。