简单课程安排问题

问题描述:假定某大学有门课程需要使用同一个教室来上课。显然,我们不能在一个教室同时上两门或多门课程。因此,每门课使用教室的方式是独享的。假定这n门课程的集合为C={c1,c2,...,cn}。每门课使用教室的时间为{si,fi},i=1,2,...,n。这里si=开始时间,fi=结束时间。假设我们的目标是容纳尽可能多的课程门数,请你为此设计一个算法。

算法设计:

程序实现:

 1 #include<iostream>
 2 
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 struct act // si fi是同一课程的开始和结束时间,用结构体数组存储表示
 8 
 9 {
10 
11 int si ;
12 
13 int fi ;
14 
15 };
16 
17 bool cmp(act a,act b) //比较各门课程结束时间
18 
19 {
20 
21 return a.fi < b.fi;
22 
23 }
24 
25 void greedychoose(int n,act a[])
26 
27 {
28 
29 int count=1,i=0; //初始化,将第一个活动放入a[0]
30 
31 for( int j=1;j<n;j++ ) //往下依次找,若当前课程开始时间大于等于上一门课程的结束时间则选择
32 
33 {
34 
35 if(a[j].si>=a[i].fi)
36 
37 {
38 
39 i=j;
40 
41 count++;
42 
43 }
44 
45 }
46 
47 cout <<"选择的活动数量为:"<< count << endl ;
48 
49 }
50 
51 int main()
52 
53 {
54 
55 int n;
56 
57 cout << "请输入活动数目" <<endl;
58 
59 cin >> n ;
60 
61 act a[20] ;
62 
63 cout << "请依次输入活动的开始时间和结束时间"<<endl;
64 
65 for(int i=0;i<n;i++)
66 
67 {
68 
69 cin >> a[i].si >> a[i].fi ;
70 
71 }
72 
73 sort(a,a+n,cmp);
74 
75 cout<<"按结束时间升序排序结果为:"<<endl;
76 
77 for(int j=0;j<n;j++)
78 
79 {
80 
81 cout << "si="<< a[j].si << " " << "fi=" << a[j].fi << endl ;
82 
83 }
84 
85 greedychoose(n,a);
86 
87 return 0;
88 
89 }

结果输出:

posted @ 2024-01-20 11:43  棒打鲜橙不加冰  阅读(19)  评论(0编辑  收藏  举报