[做得多了就水了]事件選擇

來源:互聯網
上載者:User

【描述】

Dragon開了一個新的律師事務所,他每天需要處理很多的事情:每一個顧客要求Dragon在某一段固定的時間內為其提供諮詢服務。具體的說,第i名顧客需要Dragon在時間[ai, bi]中為其服務。假如Dragon同學答應為顧客i提供諮詢,那麼在時間[ai, bi]中,Dragon同學就不能再為第二名顧客提供服務,但是在對顧客i的服務結束後可以立刻可對下一名顧客服務,就是說在服務顧客([1..3])後可直接服務([3..4])。現在Dragon同學希望能給最多的顧客提供服務。

我們認為初始時刻為0。

【輸入格式】

 第一行一個正整數n,表示顧客總數。然後n行每行兩個正整數a[i]、b[i],描述第i名顧客的要求。

【輸出格式】

一行一個正整數表示最多能服務的顧客。

【範例輸入】

3

1 3

2 4

3 5

【範例輸出】

2

【資料範圍】

0 <= a[i] < b[i] <= 100000;

0 < n < 100000。

【分析】

這是經典的叫什麼任務分配的動歸。f[i]表示i時刻能得到的最多的人數。從後向前f[i]=max(f[i-1],f[c[p].end]+1),其中c[p].str等於i。

//100%#include <stdio.h>#include <stdlib.h>#define maxn 100010int f[maxn];struct ss{       int str,end;} c[maxn];int n,p;int cmp(const void*a,const void*b){    ss c=*(ss*)a,d=*(ss*)b;    if (c.str<d.str) return -1;    return 1;}int main(){    freopen("affair.in","r",stdin);    freopen("affair.out","w",stdout);        scanf("%d",&n);    for (int i=1;i<=n;++i) scanf("%d%d",&c[i].str,&c[i].end);    c[0].str=-1;    qsort(c,n+1,sizeof(ss),cmp);    p=n;    for (int i=c[n].str;i>=0;--i)    {        f[i]=f[i+1];        while (c[p].str>i) --p;        if (c[p].str==i)           while (c[p].str==i)           {                 if (f[c[p].end]+1>f[i]) f[i]=f[c[p].end]+1;                 --p;           }    }    printf("%d\n",f[0]);        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.