码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-27 23:47:01      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:ios   lag   ace   ref   struct   贪心   int   问题   bool   

题目: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

标签:ios   lag   ace   ref   struct   贪心   int   问题   bool   

原文地址:https://www.cnblogs.com/douzujun/p/8480817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!