zoukankan      html  css  js  c++  java
  • poj 2376 Cleaning Shifts

                                                                                                 Cleaning Shifts
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 18151   Accepted: 4620

    Description

    Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning chores around the barn. He always wants to have one cow working on cleaning things up and has divided the day into T shifts (1 <= T <= 1,000,000), the first being shift 1 and the last being shift T. 

    Each cow is only available at some interval of times during the day for work on cleaning. Any cow that is selected for cleaning duty will work for the entirety of her interval. 

    Your job is to help Farmer John assign some cows to shifts so that (i) every shift has at least one cow assigned to it, and (ii) as few cows as possible are involved in cleaning. If it is not possible to assign a cow to each shift, print -1.

    Input

    * Line 1: Two space-separated integers: N and T 

    * Lines 2..N+1: Each line contains the start and end times of the interval during which a cow can work. A cow starts work at the start time and finishes after the end time.

    Output

    * Line 1: The minimum number of cows Farmer John needs to hire or -1 if it is not possible to assign a cow to each shift.

    Sample Input

    3 10
    1 7
    3 6
    6 10

    Sample Output

    2

    Hint

    This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed. 

    INPUT DETAILS: 

    There are 3 cows and 10 shifts. Cow #1 can work shifts 1..7, cow #2 can work shifts 3..6, and cow #3 can work shifts 6..10. 

    OUTPUT DETAILS: 

    By selecting cows #1 and #3, all shifts are covered. There is no way to cover all the shifts using fewer than 2 cows.

    Source

            贪心算法
    题解:给定T个时间区间,区间范围[1,T],不同牛有不同的工作时间,求至少多少头牛工作可以覆盖这个区间。
           首先以牛开始工作的时间先后顺序排序,之后不断循环更新起点=终点+1,在开始工作时间能覆盖起点的牛中,每次选出一头工作时间最晚的牛,更新终点   
        具体AC代码:
    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N_max = 25000;
    pair<int, int>cows[N_max];
    int N, T;
    bool cmp(const pair<int, int>&a, const pair<int, int>&b) {
        return (a.first<b.first||(a.first==b.first&&a.second>b.second));
    }
    int solve() {
        int used_cows = 0;
        int end = 0, num = 0;
        while (end < T) {
            int begin = end + 1;//此时的end是上一头牛的工作结束时间,此时的begin为当前的牛工作开始时间要在begin之前
            for (int i = num;i < N;i++) {//选出新的一头牛,使得工作结束时间越晚越好
                if (cows[i].first <= begin) {
                    if (cows[i].second >= begin)//别忘加等于,有可能牛的工作区间只有1个,譬如3-3
                        end = max(end, cows[i].second);//在能选的牛中选一条,使得工作的时间到最晚
    
                }
                else {
                    num=i;//没有符合要求的牛可以挑选了,换新牛
                    break;
                }
            }
            //判断这选出来的牛是否符合要求,即它的工作结束时间必须要大于begin,否则之间有区间不能被覆盖
            if (begin > end) {//此时begin是大于等于当前挑选出来的牛的开始时间,而end是当前牛的工作结束时间
                return -1;
            }
            else used_cows++;
        }
        return used_cows;
    }
    int main() {
        scanf("%d%d", &N, &T);
            for (int i = 0;i < N;i++)
            scanf("%d%d", &cows[i].first, &cows[i].second);
            sort(cows, cows + N,cmp);
            cout << solve() << endl;
        return 0;
    }
     
     
     
     
  • 相关阅读:
    ubuntu修改文件访问权限
    ubuntu使用root账户登录
    centos7 列出所有系统服务
    virtualbox 虚拟机硬盘扩容
    CI的意思
    更改centos 7 的默认启动为命令界面
    git Staging Deleted files
    Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
    List of data structures:数据结构大全
    List of algorithms:算法大全
  • 原文地址:https://www.cnblogs.com/ZefengYao/p/5810966.html
Copyright © 2011-2022 走看看