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

POJ 2376 Cleaning Shifts (贪心,区间覆盖)

时间:2016-05-29 22:45:10      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

题意:给定1-m的区间,然后给定n个小区间,用最少的小区间去覆盖1-m的区间,覆盖不了,输出-1.

析:一看就知道是贪心算法的区间覆盖,主要贪心策略是把左端点排序,如果左端点大于1无解,然后,

忽略小于1的部分(如果有的话),再找最长的区间,然后把这个区间的右端点作为下次寻找的起点,

再找最大区间,直到覆盖到最后。

注意:首先要判断好能不能覆盖,不能覆盖就结束,有可能会提前结束,也要做好判断,我就在这WA了好几次,

悲剧。。。其他的就比较简单了,不用说了。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;
const int maxn = 25000 + 10;
struct node{
    int l, r;
    bool operator < (const node &p) const {
        return l < p.l;
    }
};
node a[maxn];

int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; ++i)  scanf("%d %d", &a[i].l, &a[i].r);
    sort(a, a+n);

    bool ok = true;
    int s = 1, e = 1, cnt = 1;
    if(a[0].l > 1){  printf("-1\n");  return 0; }

    for(int i = 0; i < n; ++i){
        if(a[i].l <= s)  e = max(e, a[i].r);
        else{
            ++cnt;
            s = e + 1;
            if(a[i].l > s){ ok = false;  break; }
            else e = max(e, a[i].r);
        }
        if(e >= m)  break;
    }

    if(!ok || e < m)  printf("-1\n");
    else  printf("%d\n", cnt);
    return 0;
}

 

POJ 2376 Cleaning Shifts (贪心,区间覆盖)

标签:

原文地址:http://www.cnblogs.com/dwtfukgv/p/5540484.html

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