poj1716 – Integer Intervals

來源:互聯網
上載者:User

                                    想看更多的解題報告:
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;}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.