先把区间按区间的起始位置从小到大排序,然后从前往后看一遍,如果下一个区间的开始比前一个区间的末尾要小。那么这两个区间就可以合并。
#include<iostream> #include<algorithm> using namespace std; const int MAXN = 1e5+10; struct node{ int s,e; }Interval[MAXN]; bool visit[MAXN]; bool cmp(node a,node b) { if(a.s==b.s) { return a. e< b.e; } return a.s < b.s; } int main() { int a,b; char c; int cnt = 0; while(cin >> a >> c >> b) { Interval[cnt].s = a; Interval[cnt].e = b; visit[cnt]= true; cnt++; } sort(Interval,Interval+cnt,cmp); for(int i = 1 ; i < cnt ; i++) { if(Interval[i].s <= Interval[i-1].e)//合并两个区间 { Interval[i].s = min(Interval[i-1].s,Interval[i].s); Interval[i].e = max(Interval[i-1].e,Interval[i].e); visit[i-1]=false; } } for(int i = 0 ; i < cnt ; i++) { if(visit[i]) { cout<<Interval[i].s<<","<<Interval[i].e<<" "; } } return 0; }