1. 程式人生 > >POJ 3190 -Stall Reservations 小根堆 貪心 區間問題

POJ 3190 -Stall Reservations 小根堆 貪心 區間問題

Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows. 

Help FJ by determining:
The minimum number of stalls required in the barn so that each cow can have her private milking period
An assignment of cows to these stalls over time
Many answers are correct for each test dataset; a program will grade your answer.
Input
Line 1: A single integer, N 

Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Output
Line 1: The minimum number of stalls the barn must have. 

Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
Sample Input
5
1 10
2 4
3 6
5 8
4 7
Sample Output
4
1
2
3
2
4
Hint
Explanation of the sample: 

Here's a graphical schedule for this output: 

Time     1  2  3  4  5  6  7  8  9 10

Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>

Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..

Stall 3 .. .. c3>>>>>>>>> .. .. .. ..

Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
Other outputs using the same number of stalls are possible.

題意:N頭牛在房子吃草,每個房子一段時間只能供一頭牛吃草,求所有的牛吃草最少需要多少個房子,且輸出牛與對應的房子編號

思路:貪心 對於每一頭牛,先按照開始吃草的時間排序,掃描滿足當前吃草的牛開始吃草的時間不早於最後一頭牛吃草結束的時間,如果這樣的房子不存在則新建一個,可以使用小根堆來維護每個房子最後一頭牛吃草的結束時間,嘗試把當前的牛安排在堆頂,小根堆的時間複雜度O(log N)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
#include <set>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 5e4+5;
struct node
{
    int s;
    int e;
    int id;
    friend  bool operator<(node a,node b)
    {
        return a.e>b.e;
    }
}a[N];
int t[N];
bool cmp(node a,node b)
{
    return a.s<b.s;
}
int main()
{
    int n;
    while(scanf("%d",&n)==1){
        for(int i=0;i<n;i++){
            scanf("%d%d",&a[i].s,&a[i].e);
            a[i].id=i;
        }
        memset(t,0,sizeof(t));
        sort(a,a+n,cmp);
        priority_queue<node> que;//優先佇列+自定義
        int num=0;
        que.push(a[0]);
        t[a[0].id]=++num;
        for(int i=1;i<n;i++){
            node now=que.top();
            if(now.e<a[i].s){
                t[a[i].id]=t[now.id];
                que.pop();
                que.push(a[i]);
            }
            else{
                t[a[i].id]=++num;
                que.push(a[i]);
            }
        }
        cout<<num<<endl;
        for(int i=0;i<n;i++)
            printf("%d\n",t[i]);
    }

    return 0;
}