1012.区间合并 |
Time Limit: 1000 MS Memory Limit: 32768 KB Total Submission(s): 75 Accepted Submission(s): 15 |
Description |
给定n个开区间,合并他们中的重合者,输出合并后的区间数量。
|
Input |
第一行:n(1 <= n <= 1000)
第2至第n+1行:每行两个整数,第i行的两个整数表示第i-1个区间的左边界和右边界。 |
Output |
合并后所剩余的区间数量。
|
Sample Input |
3 1 3 2 5 6 7 |
Sample Output |
2 |
也可以用并查集做,且思路更好得。
#include<stdio.h>
struct cell{
int fromm;
int too;
}s[1001];
void quicksort(struct cell s[],int l,int h){
if (l>=h)return ;
int j ,i,key;
struct cell key1;
i=l;j=h;key=s[i].fromm,key1=s[i];
while(i<j){
while(i<j&&s[j].fromm>key)j--;
if (i<j) s[i++]=s[j];
while (i<j&&s[i].fromm<key)i++;
if (i<j) s[j--]=s[i];
}
s[i]=key1;
if (l<i-1)
quicksort(s,l,i-1);
if (i+1<h)
quicksort(s,i+1,h);
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d%d",&s[i].fromm,&s[i].too);
quicksort(s,1,n);
int maxx=s[1].too;
int kk=1;
for(i=2;i<=n;i++){
if(s[i].fromm>=maxx){
kk++;
maxx=s[i].too;
}
else
if(s[i].too>maxx)
maxx=s[i].too;
}
printf("%d",kk);
return 0;
}