poj3190 Stall Reservations(贪心)(优先队列)

题目

每个奶牛产奶的时间为A到B,每个奶牛产奶时要占用一间房子,问n头奶牛产奶共需要多少房子,并输出每头奶牛用哪间房子。

题解

贪心+优先队列
按时间顺序,如果当前有空房子则给它;要不就新建一间给它。
如果每头牛都搜一遍所有房子,太慢了!时间复杂度O(n^2)。既然每次在乎的都是空的房间,我们就开一个优先队列来存储这些房间的使用结束的时间,搞一个小根堆就好了。这样可以下降到O(nlogn)。

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5e4+10;

int n,m=0;
struct C
{
    int a,b,id;
    bool operator<(C c1)const
    {
        return a<c1.a;
    }
}a[maxn];int g[maxn];

struct A
{
    int end,id;
    bool operator<(A a1)const
    {
        return end>a1.end;
    }
};
priority_queue<A> q;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        a[i].id=i;
        scanf("%d%d",&a[i].a,&a[i].b);
    }
    sort(a+1,a+n+1);
    
    m++;
    q.push((A){a[1].b,m});
    g[a[1].id]=m;
    for(int i=2;i<=n;i++)
    {
        A t=q.top();
        if(a[i].a>t.end)
        {
            q.pop();
            q.push((A){a[i].b,t.id});
            g[a[i].id]=t.id;
        }
        else
        {
            m++;
            q.push((A){a[i].b,m});
            g[a[i].id]=m;
        }
    }
    
    printf("%d\n",m);
    for(int i=1;i<=n;i++)
    {
        printf("%d\n",g[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a_bright_ch/article/details/81080589