问题描述
若干活动集合S,其中活动i的开始时间和结束时间分别是 b i b_i bi和 e i e_i ei,若两项活动的时间没有重叠,则认为活动相容。为简单起见,开始及结束时间用整数来表示,从而活动区间不交叉即相容。求最大的两两相容和活动集合R
贪心选择策略
各项活动按结束时间排序,贪心选结束时间早的放入集合R
正确性证明:
代码实现
#include <bits/stdc++.h>
using namespace std;
struct Activity{
int id;
int begin_time;
int end_time;
Activity(){
};
Activity(int a,int b,int c){
id=a,begin_time=b,end_time=c;
};
};
bool compare(Activity a,Activity b){
return a.end_time<b.end_time;
}
void select_activity(vector<Activity>& result){
int n;
cin>>n;//输入活动数量
vector<Activity> data;
int begin_time,end_time;
for(int i=0;i<n;++i){
cin>>begin_time>>end_time;
data.push_back(Activity(i,begin_time,end_time));
}
sort(data.begin(),data.end(),compare);
int last_end_time=data[0].end_time;
result.push_back(data[0]);//最优解一定包含第一个活动
for(auto it=data.begin()+1;it!=data.end();++it){
if(it->begin_time>=last_end_time){//符合相容条件
result.push_back(*it);
last_end_time=it->end_time;
}
}
cout<<"the number of chosed activities is "<<result.size()<<endl;
cout<<"the detailed message is as follows"<<endl;
for(auto it=result.begin();it!=result.end();++it){
cout<<it->id<<" "<<it->begin_time<<" "<<it->end_time<<endl;
}
}