前言
北航算法分析与设计的mooc讲过这个经典例题,还讲了变种,我觉得挺好的
题目来源:P1803 凌乱的yyy / 线段覆盖
直接放代码吧,更详细的思路可以去看开头的mooc,里面不仅讲了经典问题,还讲了变种。
#include <stdio.h>
#include <stdlib.h>
struct node{
int begin;
int end;
};
void Merge(int left,int mid,int right,struct node a[],struct node b[]){
int i,j=mid+1,k=left;
for(i=left;i<=right;i++)
b[i]=a[i];
i=left;
while(i<=mid&&j<=right){
if(b[i].end<=b[j].end){
a[k]=b[i];
k++;
i++;
}else{
a[k]=b[j];
k++;
j++;
}
}
while(i<=mid){
a[k]=b[i];
k++;
i++;
}
while(j<=right){
a[k]=b[j];
k++;
j++;
}
return;
}
void Mergesort(int left,int right,struct node a[],struct node b[]){
if(left>=right)
return;
int mid=(left+right)/2;
Mergesort(left,mid,a,b);
Mergesort(mid+1,right,a,b);
Merge(left,mid,right,a,b);
return;
}
int main(int argc, char *argv[]) {
int i,n;
scanf("%d",&n);
struct node a[n],b[n];
for(i=0;i<n;i++){
scanf("%d%d",&a[i].begin,&a[i].end);
}
Mergesort(0,n-1,a,b);
int num=1,last=a[0].end;
for(i=1;i<n;i++){
if(a[i].begin>=last){
num++;
last=a[i].end;
}
}
printf("%d",num);
return 0;
}