贪心问题 区间覆盖 —— POJ 2376 Cleaning Shift

Posted 豆子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心问题 区间覆盖 —— POJ 2376 Cleaning Shift相关的知识,希望对你有一定的参考价值。

题目:http://poj.org/problem?id=2376

题意:就是 N 个区间, 输入 N 个区间的 [begin, end],求能用它们覆盖区间[1,T]的最小组合。

题解:

1. 首先对所有奶牛的排序,按照开始时间升序排序。

2. 更新 起点 为 上一次的终点 + 1,并寻找覆盖起点,且终点最远的区间

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 25000 + 50;
typedef long long LL;

int N;
LL T;

struct Works {
    int start,
        end;
    Works(int s = 0, int e = 0) : start(s), end(e) {}
} works[maxn];

bool cmp(const Works& a, const Works& b)
{
    return a.start < b.start || (a.start == b.start && a.end > b.end);
}

void solve()
{
    cin >> N >> T;
    
    for (int i = 0; i < N; i++)
    {
        scanf("%d%d", &works[i].start, &works[i].end);
    }
    
    sort(works, works + N, cmp);
    
    int ans = 0;
    int current_sum = 0;
    bool flag = true;
    while (current_sum < T)
    {
        int begin = current_sum + 1;
                
        for (int i = 0; i < N; i++)
        {
            //寻找能够能覆盖起点的牛 
            if (works[i].start <= begin) {
                //是否能覆盖起点 
                if (works[i].end >= begin) {
                    //寻找 最远的 终点
                    current_sum = max(current_sum, works[i].end); 
                }
            }
        }
        //没有找到这样的牛
        if (begin > current_sum) {
            flag = false;
            break;
        }
        else {
            ans++;
        }
    }
    if (flag) {
        printf("%d\n", ans);
    } else {
        printf("-1\n");
    }
}

int main()
{
    solve();
    return 0;
}

 

以上是关于贪心问题 区间覆盖 —— POJ 2376 Cleaning Shift的主要内容,如果未能解决你的问题,请参考以下文章

POJ - 2376 Cleaning Shifts 贪心(最小区间覆盖)

贪心算法----区间覆盖问题(POJ2376)

POJ_2376_Cleaning Shifts贪心区间覆盖

POJ 2376 (区间问题,贪心)

poj2376 Cleaning Shifts(区间贪心,理解题意)

POJ 2376 Cleaning Shifts