题目描述
周老师无聊时乱写了 n 个区间,但处女座的他随后又想将 n 个区间整理合并,但他发现区间太多了,于是他想请你帮帮他
输入
每次测试输入多组数据(小于100组),对于每组输入数据:
第一行为 n ,代表 n 个区间
接下来 n 行,每行两个数 s , t 代表区间 [s,t]
0 < n < 15000
0 <= s <= t < 10000000
输出
第一行输出一个数字 q ,代表合并后剩余的区间个数
随后 q 行 按从小到大的顺序输出区间
样例输入
3
2 4
1 3
7 7
样例输出
2
1 4
7 7
题目大概:
把线性上的很多区间合并,输出合并后的区间。
思路:
贪心,主要是有的地方等号加不加的问题要考虑一下。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct po
{
int l,r;
}a[15500],b[15500];
int cmp(po a,po b)
{
if(a.l<b.l)return 1;
else if(a.l==b.l&&a.r<b.r)return 1;
else return 0;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
}
sort(a,a+n,cmp);
int ans=0;
b[ans].l=a[0].l;
b[ans].r=a[0].r;
for(int i=1;i<n;i++)
{
if(a[i].l>b[ans].r)
{
ans++;
b[ans].l=a[i].l;
b[ans].r=a[i].r;
}
else if(a[i].l>=b[ans].l&&a[i].r>b[ans].r)
{
b[ans].r=a[i].r;
}
}
cout<<ans+1<<endl;
for(int i=0;i<=ans;i++)
{
cout<<b[i].l<<" "<<b[i].r<<endl;
}
}
return 0;
}