这个问题可以使用贪心算法来解决。我们首先将所有的区间按照左端点的大小进行排序,然后从左到右遍历所有的区间。对于每个区间,如果它的左端点大于当前合并区间的右端点,那么就将当前合并区间添加到结果中,并将当前区间设为新的合并区间;否则,我们将当前合并区间的右端点更新为当前区间的右端点和当前合并区间的右端点的较大值。
以下是C++代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
vector<pair<int, int>> intervals(N);
for (int i = 0; i < N; i++) {
cin >> intervals[i].first >> intervals[i].second;
}
sort(intervals.begin(), intervals.end());
vector<pair<int, int>> merged;
for (const auto& interval : intervals) {
if (merged.empty() || merged.back().second < interval.first) {
merged.push_back(interval);
} else {
merged.back().second = max(merged.back().second, interval.second);
}
}
for (const auto& interval : merged) {
cout << interval.first << " " << interval.second << endl;
}
return 0;
}
在这段代码中,我们首先读取输入的N和所有的区间,然后将所有的区间按照左端点的大小进行排序。然后我们遍历所有的区间,对于每个区间,如果它的左端点大于当前合并区间的右端点,那么就将当前合并区间添加到结果中,并将当前区间设为新的合并区间;否则,我们将当前合并区间的右端点更新为当前区间的右端点和当前合并区间的右端点的较大值。最后,我们输出所有的合并区间。