活动选择或任务安排问题

问题描述

若干活动集合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;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值