问题描述 给定x轴上的N条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,……N.这些坐标都是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你编写一个程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓的内部公共点是指一个点同时属于两条线段且至少在其中一条线段的内部(即除去端点的部分)。 输入描述 输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表示一条线段的二个端点的坐标。 输出描述 一个整数表示至少去掉的线段数。 输入样例 3 6 3 1 3 2 5 输出样例 1 数据范围 1<=N<=1000 提示 数据已修正 用c++语言
时间: 2024-04-08 13:34:29 浏览: 100
为了解决这个问题,我们可以使用贪心算法的思想。首先,我们将输入的线段按照端点的坐标进行排序。然后,从左至右依次遍历线段,对于每条线段,我们检查它与前面已选择的线段是否有内部公共点。如果有,则将该线段从选择中去掉;如果没有,则将该线段加入选择中。
具体的实现步骤如下:
1. 定义结构体Segment来表示线段,包括起点和终点的坐标。
2. 根据输入的线段信息,构建一个Segment类型的数组,并按照端点坐标进行排序。
3. 定义一个变量count来记录已选择的线段数,初始化为1。
4. 遍历排序后的线段数组,从第二个线段开始(即下标为1的线段):
a. 检查当前线段与前面已选择的线段是否有内部公共点。
b. 如果有内部公共点,则不选择当前线段,count不增加。
c. 如果没有内部公共点,则选择当前线段,count增加。
5. 输出N减去count的值,即为至少去掉的线段数。
以下是用C++语言实现的代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
struct Segment {
int start;
int end;
};
bool compareSegments(Segment a, Segment b) {
if (a.start == b.start) {
return a.end < b.end;
}
return a.start < b.start;
}
int main() {
int N;
std::cin >> N;
std::vector<Segment> segments(N);
for (int i = 0; i < N; i++) {
std::cin >> segments[i].start >> segments[i].end;
}
std::sort(segments.begin(), segments.end(), compareSegments);
int count = 1;
int lastEnd = segments[0].end;
for (int i = 1; i < N; i++) {
if (segments[i].start <= lastEnd) {
continue;
}
count++;
lastEnd = segments[i].end;
}
int removedSegments = N - count;
std::cout << removedSegments << std::endl;
return 0;
}
```
希望对你有帮助!如有疑问,请继续提问。
阅读全文