活动安排问题

问题描述:

  设有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 void f(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

 





猜你喜欢

转载自www.cnblogs.com/wangxuelin/p/9021062.html