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

来源:互联网 发布:midascft是什么软件 编辑:程序博客网 时间:2024/04/20 00:52

题目链接: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-5using 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]);    }}
阅读全文
0 0
原创粉丝点击