zoukankan      html  css  js  c++  java
  • POJ 2376 Cleaning Shifts (贪心,区间覆盖)

    题意:给定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
    ");  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
    ");
        else  printf("%d
    ", cnt);
        return 0;
    }
    
  • 相关阅读:
    电路中的保险丝选择
    EXCEL使用自动换行后,行高在预览和打印字符不全(转载)
    PCB阻抗受控的通孔之设计(转载)
    PCB的阻抗控制
    关于Altera LVDS 经验分享
    在FPGA中实现源同步LVDS接收正确字对齐
    Altera 速度等级
    LVDS原理及设计指南--以及衍生的B-LVDS-M-LVDS--CML-LVPECL电平等
    Bayer图像处理
    Image Signal Processor
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5540484.html
Copyright © 2011-2022 走看看