LOJ #10000 活動安排
阿新 • • 發佈:2019-01-10
題目描述
設有 n個活動的集合 E={1,2,..,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動 i 都有一個要求使用該資源的起始時間 si和一個結束時間 fi,且 si<fi。如果選擇了活動 i ,則它在時間區間 [si,fi) 內佔用資源。若區間 [si,fi) 與區間 [sj,fj)不相交,則稱活動 i 與活動 j 是相容的。也就是說,當 fi≤sj 或 fj≤si 時,活動 i 與活動 j 相容。選擇出由互相相容的活動組成的最大集合。
輸入格式
第一行一個整數 n;
接下來的 n 行,每行兩個整數 si 和 fi。
輸出格式
輸出互相相容的最大活動個數。
樣例
樣例輸入
4
1 3
4 6
2 5
1 7
樣例輸出
2
資料範圍與提示
1≤n≤1000
區間排程問題。貪心演算法。在可選的活動中每次都選取結束時間最早的活動。
AC程式碼:
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int main() { int n; cin>>n; pair<int,int> acti[1001]; for(int i=1;i<=n;i++) { //為了讓結束時間早的活動排在前面,把結束時間存入first,把開始時間存入second int s,f; cin>>s>>f; acti[i].first=f; acti[i].second=s; } sort(acti+1,acti+n+1);//對pair進行的是字典序比較 //t是最後所選活動的結束時間,ans是互相相容的最大活動個數 int ans=0,t=0; for(int i=1;i<=n;i++) { if(t<=acti[i].second) { ans++; t=acti[i].first; } } cout<<ans; }