程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 2376 Cleaning Shifts,poj2376

poj 2376 Cleaning Shifts,poj2376

編輯:C++入門知識

poj 2376 Cleaning Shifts,poj2376


                                                                                             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

USACO 2004 December Silver         貪心算法 題解:給定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;
}

 

       

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved