题目链接: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]);
}
}