贪心算法之最大相容活动子集合问题

问题:

     有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相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。有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相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。

代码:

#include<iostream>
#include<time.h>
#include<iomanip>
#include<fstream>
#include<algorithm>

using namespace std;

struct a{
    int si;//开始时间
    int fi;//结束时间
    int ii;//编号
};

bool compare(a x,a y){
    return x.fi<=y.fi;
}
int main(){
    cout<<"输入活动数:";
    int m;
    cin>>m;
    a action[m];

    for(int i = 0; i < m; i++){
        cout<<"输入第"<<i<<"活动的开始时间和结束时间";
        cin>>action[i].si>>action[i].fi;
        action[i].ii = i+1;
    }
    int num=1;
    int b[m];
    sort(action,action+m,compare);
    b[num++]=action[0].ii;
    int k=0;
    for(int i=1;i<m;i++){
        if(action[i].si>=action[k].fi){
            b[num++]=action[i].ii;
            k=i;
        }
    }
    ofstream fout;
    fout.open("output1.txt");
    for(int i=0;i<num;i++)
        fout<<b[i]<<' ';

    return 0;

}

猜你喜欢

转载自blog.csdn.net/xiao785799675/article/details/80548304
今日推荐