活動安排問題
阿新 • • 發佈:2018-05-13
size namespace 最大 nodes 設有 cout 資源 ++ 子集
問題描述:
設有n個活動的集合E={1,2,……,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si<fi。如果選擇了活動i,則它在時間區間[si,fi]內占用資源。若區間[si,fi]與區間[sj,fj]不相交,則稱活動i與活動j是相容的。也就是說,當si>=fj或者sj>=fi時,活動i與活動j相容。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合。
代碼:
1 #include <iostream> 2 #include <cstdio> 3#include <string> 4 #include <algorithm> 5 #include <stack> 6 #include <queue> 7 using namespace std; 8 9 const int maxn=100; 10 int vis[maxn]; 11 struct node 12 { 13 int num; 14 int s; 15 int e; 16 /* 17 bool operator<(node b) 18 { 19 if(this->e==b.e)20 return this->s<b.s; 21 return this->e < b.e; 22 } 23 */ 24 }nodes[maxn]; 25 bool cmp(node a,node b) 26 { 27 if(a.e<b.e) 28 return true; 29 else if(a.e==b.e && a.s<b.s) 30 return true; 31 return false; 32 } 33 34 voidf(node *nodes,int n) 35 { 36 vis[0]=1; 37 int t=0; 38 for(int i=1;i<n;i++) 39 { 40 if(nodes[i].s>=nodes[t].e) 41 { 42 vis[i]=1; 43 t=i; 44 } 45 } 46 } 47 int main() 48 { 49 int n; 50 cin>>n; 51 queue<int> st; 52 for(int i=0;i<n;i++) 53 { 54 cin>>nodes[i].s>>nodes[i].e; 55 nodes[i].num=i; 56 } 57 sort(nodes,nodes+n,cmp); 58 memset(vis, 0, sizeof(vis)); 59 f(nodes,n); 60 for(int i=0;i<n;i++) 61 { 62 if(vis[i]==1) 63 st.push(nodes[i].num); 64 } 65 int len=(int)st.size(); 66 cout<<"The answer is:"<<endl; 67 for(int i=0;i<len;i++) 68 { 69 cout<<st.front()<<" "; 70 st.pop(); 71 } 72 cout<<endl; 73 return 0; 74 }
Input:
第一行輸入活動的數量n。
第二行輸入2*n個整數,依次表示活動的開始時間和結束時間。
Output:
輸出要被安排的活動的編號,編號按照輸入順序從0開始編號。
輸入示例:
3
1 3 2 4 3 5
輸出示例:
0 2
活動安排問題