POJ - 2376 Cleaning Shifts

原创 2016年06月01日 11:38:03
Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u

 Status

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


#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 25011;
struct node
{
    int l, r;
}p[N];
bool cmp(struct node a,struct node b)
{
    return a.l<b.l;
}


int main()
{
    int n, T;
    while(scanf("%d %d",&n, &T)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&p[i].l, &p[i].r);
        }
        sort(p,p+n,cmp);
        int i=0, j, t=0, ans=0;
        if(p[i].l>1)
        {
            printf("-1\n");
            continue;
        }
        while(i<n&&t<T)
        {
            j=-1;
            while(i<n&&t<=T&&p[i].l<=t+1)
            {
                j=max(j,p[i].r);
                i++;
            }
            if(j<=t)
            {
                break;
            }
            t=j;
            ans++;
        }
        if(t<T)
        {
            printf("-1\n");
        }
        else
        {
            printf("%d\n",ans);
        }
    }
    return 0;
}


区间覆盖属于贪心思想吧,用能延伸到最右边的值覆盖所有较小的值
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj2376Cleaning Shifts_贪心

Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17935   Accepted:...

POJ 2376 - Cleaning Shifts(贪心)

题目: 题意:每一只牛工作一定的时间段,要

区间贪心:POJ2376--Cleaning Shifts

本文结合poj2376探讨有关区间问题的贪心算法。

POJ 2376 Cleaning Shifts

题意:给出了n只牛的工作时间以及总的工作时间t,求最少用多少牛就可以把1-t的时间覆盖完。 题目好多坑- -, 1.如果起始时间的最小值不是1就不能开始工作。 2.加入某只牛在t1时间结束,那么...

Cleaning Shifts POJ - 2376(区间覆盖,排序+贪心)

Farmer John is assigning some of his N (1

POJ NO.2376 Cleaning Shifts(贪心,区间重叠)

问题描述: 给出S,T两个整数,让你在给出的S个闭区间内找到最少的几个闭区间,能够将[1,T]这个区间给覆盖。 涉及到区间重叠问题。 题目链接:点击打开链接 思路: 用pair类型的数组存储...
  • quper1g
  • quper1g
  • 2016年01月27日 20:32
  • 135

POJ 2376 Cleaning Shifts(区间覆盖问题)

Description Farmer John is assigning some of his N (1 Each cow is only available at some interval...

POJ2376Cleaning Shifts(贪心)

Farmer John is assigning some of his N (1

[poj 2376] Cleaning Shifts [最小区间覆盖 贪心]

Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17550 Accep...

POJ 2376 Cleaning Shifts 区间贪心

#include #include #include #include #include #include #include #include #include #include #include #...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ - 2376 Cleaning Shifts
举报原因:
原因补充:

(最多只允许输入30个字)