zoukankan      html  css  js  c++  java
  • POJ_2376_Cleaning Shifts【贪心】【区间覆盖】

    题目链接

    题目大意:

    有一些奶牛,每只奶牛负责一个时间段。问覆盖完全部的时间段最少需要多少只奶牛。若不能全部覆盖,输出-1.

    
    

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

    
    

    typedef long long ll;

    const int maxn = 25000 + 5;
    const int maxd = 1000000 + 5;
    
    struct Edge
    {
        int x;
        int y;
    }cow[maxn];
    
    int N, T;
    int X, Y;
    
    bool cmp(Edge a, Edge b) 
    {
        if (a.x == b.x) return a.y>b.y;
        return a.x<b.x;
    }
    
    void input() 
    {
        X = 0; Y = 0;
        scanf("%d%d", &N, &T);
        for (int i = 0; i<N; i++) 
        {
            scanf("%d%d", &cow[i].x, &cow[i].y);
            if (cow[i].x == 1) X = 1;
            if (cow[i].y == T) Y = 1;
        }
    }
    
    void solve() 
    {
        sort(cow, cow + N, cmp);
        //若所有的牛的工作时间的起始时间和结束时间都没有覆盖掉区间的起始时间和结束时间  
        if (X == 0 || Y == 0) 
        {
            printf("-1
    ");
            return;
        }
        int ans = 1, End = 0, sum = 0;
        int Start = cow[0].y;
        int maxy = cow[0].y;
        while (true) 
        {
            while (End + 1<N&&cow[End + 1].x <= Start + 1)    //End代表当前点的坐标
            {
                End++;
                if (cow[End].y>maxy) 
                {
                    maxy = cow[End].y;
                }
            }
            if (maxy != Start)          //start为当前有效区间的最远距离
            {
                ans++;
                Start = maxy;
            }
            else 
            {
                if (End == N - 1)  //已覆盖掉区间
                {  
                    break;
                }
                else //说明中间有的时间点覆盖不到  
                {  
                    printf("-1
    ");
                    return;
                }
            }
        }
        printf("%d
    ", ans);
        return;
    }
    
    int main() {
        input();
        solve();
        return 0;
    }

    2018-04-01


    作者:is_ok
    出处:http://www.cnblogs.com/00isok/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    下面我使用vector容器为基础来构成一棵树
    COM编程
    vc买书指导
    [转帖] 职场学习=贼学技术
    创业者应具备的基本商业知识
    比尔盖茨的10大优秀员工准则(看你符合几条)
    损害个人魅力的26条错(转帖)
    流行:时尚健康美女10大标准
    人生要做的30件事(转帖)
    最伟大的管理原则
  • 原文地址:https://www.cnblogs.com/00isok/p/8687894.html
Copyright © 2011-2022 走看看