工作排序问题 poj2376

代码 https://www.cnblogs.com/oscar-cnblogs/p/6295076.html

poj2376题 

题意:农夫John和他的cows系列。这次cows们被John命令cleaning shifts,给你总区间时间,和每头cow负责clean的子区间时段,问怎样安排可以使最少的cow打扫于整个时间区间。
思路:典型贪心。先对所有cow开始clean的时间升序排序,然后再依次遍历每头cow,保证开始时间在上一头cow时段内,使结束时间最长。(注意:不重叠但相邻也成立)一旦超出上一头cow的结束时段,更新cow,并继续向下遍历。

输入的第一行 n,T n表示有几个区间,T表示终点是多少,从一开始到T的区间全覆盖,下面2~2+n行是输入的区间,求最小覆盖区间数

输入

3 10
1 7
3 6
6 10

输出

2
#include <iostream>
#include <stdio.h>
#include <algorithm>

using namespace std;

typedef long long ll;
ll T,N;
struct Cow
{
    ll st,ed;
    bool operator < (Cow c) const//按照结束时间升序排列 重载操作符
    {
        return st < c.st;
    }
} cow[25005];

//贪心策略 在合适的工作时间内 选择结束时间最晚的

int main()
{
   cin>>N>>T;
    for (int i = 0; i < N; i++)
    {
        scanf("%lld%lld", &cow[i].st, &cow[i].ed);
    }
    //printf("%d
", solve());
    sort(cow, cow+N);
    cow[N].st = 0x7fffffff;//因为后面要判断cow[i+1]
    bool found = false;
    ll t = 0, temp = 0;
    int ans = 0;
    for (int i = 0; i < N; i++)//这样只用找一遍即可,从小到大排列 不断的扩大t 扩大课工作时间的区间
    {
        //  found = false;
        if (cow[i].st <= t + 1)
        {
            if(cow[i].ed > temp)
            {
                temp = cow[i].ed;
                found = true;
            }
            if (cow[i+1].st > t+1 && found)//如果下一个 区间左端点 在t的右边 那么所找到的这个点是必然要要的
            {
                t = temp;
                ans++;
                found = false;//t点更新 就去找下一个区间 这个之前放错了位置 每一次found都会改变t值
            }
        }
    }
    if (t<T)
        printf("-1
");
    else
        printf("%d
",ans);
    return 0;
}

 这个代码看了之后也不太理解,先记在这,等把工作排序问题搞懂再来看看理解理解吧

另一组输入数据可以调试看看代码的实际运行

3 10

1 6

1 5

6 10

输出也是

2

原文地址:https://www.cnblogs.com/someonezero/p/12802424.html