给定一系列闭区间[a, b],将重叠的区间合并,输出最少数目的区间。
思路:将这些区间按照起点升序排列,然后依次判断当前区间是否与前一个区间重叠,如果重叠,更新前一个区间;如果不重叠,输出前一个区间。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Interval{
int start;
int stop;
};
bool operator < (const Interval &a, const Interval &b){
return a.start < b.start;
}
int main(){
int n;
cin >> n;
vector<Interval> in(n);
for(int i = 0; i < n; ++i)
cin >> in[i].start >> in[i].stop;
sort(in.begin(), in.end());
int x = in[0].start, y = in[0].stop;
for(int i = 1; i < n; ++i){
if(in[i].start >= x && in[i].start <= y){
y = max(y, in[i].stop);
}
else{
cout << x << " " << y << endl;
x = in[i].start;
y = in[i].stop;
}
}
cout << x << " " << y << endl;
return 0;
}