想看更多的解題報告:
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 164KTime 32MS*/#include <stdio.h>#include <stdlib.h>#define MAXV 10010int 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;}