贪心区间问题 (白皮书例题2)

//区间调度问题:结束时间越早之后可选的工作也就越多。
//证明:
/*
       与其他选择方案相比,该算法的选择方案在选取了相同数量的更早数量的更早开始工作时,
       其最终结束时间不会比其他方案的更晚
*/
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 100000
int N,S[MAXN],T[MAXN];
pair<int ,int> itv[MAXN];
int main()
{
    //pair的sort是按pair的first从小到大排序
    //为了让结束时间早的工作排在前面,把T存入first,把S存入second
    int i;
    for(i=0;i<N;i++)
    {
        itv[i].first = E[i];   //E是终止时间
        itv[i].second =S[i];   //S是开始时间
    }
    sort(itv,itv+N);
    int ans=0,t=0;
    //t是最后所选工作的结束时间
    for(i=0;i<N;i++) //这里直接枚举所有的second就行,包括自己,这样写方便,反正是取<,自己也没有什么关系
    {
        if(t<itv[i].second) //如果一个end小于一个start,则记一次数
        {                   //并把start设为新的end
            ans++;
            t=itv[i].first;
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xigongdali/article/details/81433647