头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
任务描述
本关任务:求解活动安排问题。
假定一个有n个活动(activity)的集合S={a 1 ,a 2,....,a n},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动a i都有一个开始时间s i和一个结束时间f i,其中0<=s i<f i<=32767。如果被选中,任务a i 发生在半开时间区间[s i ,f i )期间。如果两个活动a i和a j满足[s i ,f i )和[s j ,f j )不重叠,则称它们是兼容的。也就说,若s i >=f j 或s j >=f i ,则a i和a j 是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。
编程要求
根据提示,在右侧编辑器补充代码,计算并输出可兼容活动的最大数量。
测试说明
输入格式:
第一行一个整数n(n≤1000);
接下来的n行,每行两个整数,第一个s i ,第二个是f i (0<=s i <f i <=32767)。
输出格式:
输出最多能安排的活动个数。
输入样例:
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
输出样例:
4
样例解释:
最大可兼容活动数量为4。安排的4个活动为1 4, 5 7, 8 11和12 14。
测试代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Action
{
/* 请在这里填写答案 */
/********** Begin **********/
/********** End **********/
};
int n;
vector<struct Action> A;
//求解结果表示
vector<bool> flag; //标记选择的活动
int Count = 0; //选取的兼容活动个数
void solve() //求解最大兼容活动子集
{
/* 请在这里填写答案 */
/********** Begin **********/
/********** End **********/
}
int main()
{
cin>>n;
for(int i = 0; i < n; i++){
Action t;
cin>>t.b>>t.e;
A.push_back(t);
}
solve();
cout<<Count<<endl;
return 0;
}
补充代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Action
{
/* 请在这里填写答案 */
/********** Begin **********/
int b;
int e;
bool operator < (const Action &s) const{
return e < s.e;
}
/********** End **********/
};
int n;
vector<struct Action> A;
//求解结果表示
vector<bool> flag; //标记选择的活动
int Count = 0; //选取的兼容活动个数
void solve() //求解最大兼容活动子集
{
/* 请在这里填写答案 */
/********** Begin **********/
sort(A.begin(), A.end());
int preEnd = 0;
for(int i=0 ; i<n; i++){
if(A[i].b >= preEnd){
flag.push_back(true);
preEnd = A[i].e;
Count++;
}
else{
flag.push_back(false);
}
}
/********** End **********/
}
int main()
{
cin>>n;
for(int i = 0; i < n; i++){
Action t;
cin>>t.b>>t.e;
A.push_back(t);
}
solve();
cout<<Count<<endl;
return 0;
}