POJ 3190 Stall Reservations (贪心+优先队列)

题目链接:http://poj.org/problem?id=3190

题目大意:这里有N只 (1 <= N <= 50,000) 挑剔的奶牛! 他们如此挑剔以致于必须在[A,B ]的时间内产奶(1 <= A <= B <= 1,000,000)当然, FJ必须为他们创造一个决定挤奶时间的系统.当然,没有牛想与其他奶牛分享这一时光
帮助FJ做以下事:
使每只牛都有专属时间的最小牛棚数
每只牛在哪个牛棚
也许有很多可行解。输出一种即可。

思路:对奶牛进行排序(开始时间升序,结束时间升序);用一个优先队列记录在牛棚中的牛(入队相当于进牛棚),并且以结束时间早优先。一个奶牛先与队列头比较,如果这头奶牛的开始时间晚于牛棚里的牛的结束时间,那么就可以进入这个牛棚;如果这头奶牛的开始时间早于牛棚里的牛的结束时间,那么必须开辟一个新的牛棚。用一个数组记录奶牛所在牛棚编号。

下面是代码:

#include<iostream> 
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define LL long long
#define EPS 1e-5

using namespace std;

struct point{
    int l,r,k;

    friend bool operator<(point a,point b)
    {
        return a.r>b.r;
    } 
}num[50005];

int cmp(point a,point b)
{
    if(a.l!=b.l) return a.l<b.l;
    else return a.r<b.r;
} 

int n,h[50005];
priority_queue<point> q;

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%d%d",&num[i].l,&num[i].r),num[i].k=i;
        sort(num,num+n,cmp);
        int t=1;
        q.push(num[0]);
        h[num[0].k]=t++;
        for(int i=1;i<n;i++)
        {
            point tmp=q.top();
            if(tmp.r<num[i].l)  //前一头牛利用完了牛棚
            {
                h[num[i].k]=h[tmp.k];  //该头牛的牛棚编号与前一头的相同
                q.pop();  //前一头牛出牛棚
            }
            else  //之前的牛棚都在使用
            {
                h[num[i].k]=t++;  //改头牛将进入新的牛棚
            }
            q.push(num[i]);  //该头牛进入牛棚
        }
        while(!q.empty())  //清空队列
            q.pop();
        printf("%d\n",t-1);
        for(int i=0;i<n;i++)
            printf("%d\n",h[i]);
    }
}

猜你喜欢

转载自blog.csdn.net/cyf199775/article/details/74278848