【描述】
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;}