想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:给定N个闭区间,每个区间都要至少有两个数被选中,问最少有多少个数被选中
解题思路:
贪心算法
先必须将N个区间排序,将末端或者前端排序都可以,此例我是用的将前端从小到大排序
总是拿前一个区间取值的区间和现在的区间去比较
而已经排好序两个区间的位置无非只有3种情况
用s与t表示前一个区间取值的范围[s,t]
而s与t的初始化应该取s=iv[0].b,t=iv[0].b+1,刚好符合题目的
每个区间最少要取两点
而iv[i].b,iv[i].e表示当前区间的范围的起始
那么这三种情况如下:
1)iv[i].e<=t
2)iv[i].e<s
3)iv[i].e>=s
而遇到这四种情况的处理应该这样:
1)这说明前面那个区间包含了当前区间,应该不用处理,直接往
后面走
2)这种情况代表两个区间没有交集,那么应该将前面那个区间舍
去,从当前区间再找两个点开始
3)这代表两个区间有交集,那么s与t应该还要取一点,在这两个
区间的交集之外
/* Memory 164K Time 32MS */ #include <stdio.h> #include <stdlib.h> #define MAXV 10010 int n; typedef struct{ int b,e; }Intervals; Intervals iv[MAXV]; int cmp(const void *a,const void *b){ return ((Intervals *)a)->b-((Intervals *)b)->b; } int main(){ int i,j,s,t,sum; while(~scanf("%d",&n)){ for(i=0;i<n;i++) scanf("%d%d",&iv[i].b,&iv[i].e); qsort(iv,n,sizeof(Intervals),cmp); s=iv[n-1].b; t=iv[n-1].b+1; sum=2; for(i=n-2;i>=0;i--){ if(iv[i].e>=t) continue; if(iv[i].e<s){ s=iv[i].b; t=iv[i].b+1; sum+=2; }else{ t=s; s=iv[i].b; sum++; } } printf("%d\n",sum); } return 0; }