先把区间按区间的起始位置从小到大排序,然后从前往后看一遍,如果下一个区间的开始比前一个区间的末尾要小。那么这两个区间就可以合并。
#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;
}
京公网安备 11010502036488号