区间调度问题

来源:互联网 发布:装修接单软件 编辑:程序博客网 时间:2024/05/17 23:28

有n项工作,每项工作分别在start[i]时间开始,在End(i)时间结束。对于每项工作,你都可以选择参与与否,如果选择参与,那么自始至终必须全程参与。此外参与时间段不能重叠(即使是开始的瞬间与结束的瞬间重叠也是不允许的),那么最多能参与多少项工作?

//算法思想:在可选的工作中,每次都选取结束时间最早的工作#include <iostream>#include <utility>#include <algorithm>using namespace std;//设置全局变量const int MAX = 10000;int N = 5;//工作的个数int Start[MAX] = {1, 2, 4, 6, 8};//存储开始时间的数组int End[MAX] = {3, 5, 7, 9, 10};//存储结束时间的数组pair<int, int> space[MAX];//选取最多工作的个数void Solve(){    int count = 0;//存储工作个数    int t = 0;//存储结束时间    for(int i = 0; i < N; ++i)    {        space[i].first = End[i];//第一个数据成员存储结束时间        space[i].second = Start[i];//第二个数据成员存储开始时间    }    //对结束时间按字典排序    sort(space, space + 5);    for(int j = 0; j < N; ++j)    {        if(t < space[j].second)//判断是否重叠        {            ++count;            t = space[j].first;//每次给t赋结束时间        }    }    cout << count;}int main(){    Solve();    return 0;}