POJ 3190 Stall Reservations

题意:

题意:一群很有个性的奶牛,只在固定的时间产奶,每头牛需要用一个挤奶机器,问为满足所有牛产奶,最少需要多少个挤奶机器,并按照奶牛给出的顺序来输出该奶牛挤奶机器的编号。

 

思路:

按先开始数据,后结束时间从小到大排序,优先队列维护当前在产奶的奶牛,若队列中结束时间>=开始时间,则要加一台机器。

 

算法:

贪心+优先队列

 

代码:

 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
struct F
{
    int b,e,id;
    friend bool operator<(F a,F b)
    {
       if(a.e==b.e)
        return a.b<b.b;
       return a.e>b.e;
    }
}a[100005];
bool cmp(F A,F B)
{
    if (A.b==B.b)
    return A.e<B.e;
    return A.b<B.b;
}
priority_queue<F>q;
int sta[100005];
int main()
{
    int n,i,j;
    cin>>n; 
    for (i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].b,&a[i].e);
        a[i].id=i;
    }
    sort(a+1,a+n+1,cmp);
    q.push(a[1]);
    int ans=1;
    sta[a[1].id]=1;
    for (i=2;i<=n;i++)
    {
        if (!q.empty()&&q.top().e<a[i].b)
        {
            sta[a[i].id]=sta[q.top().id];
            q.pop();
            q.push(a[i]);
        }
        else
        {
            ans++;
            sta[a[i].id]=ans;
            q.push(a[i]);
        }
    }
    cout<<ans<<endl;
    for (i=1;i<=n;i++)
    {
        cout<<sta[i]<<endl;
    }
    return 0;
}

 

posted @ 2018-08-13 22:22  C919  阅读(117)  评论(0)    收藏  举报