题目链接
题解:
这是一个贪心问题,时间区间都是闭区间包含两端。定义一个优先队列,让结束时间早的优先级高,保证了取出的都是结束时间最早的,如果一头牛的开始时间大于取出的牛的结束时间,那么这两头牛可以用一个畜栏,并且把队列第一个pop掉,否则增加一个新的畜栏,把这个新的牛加进队列。
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX_N=5e4+7;
struct node
{
int x,y,id;
bool operator <(const node &a)const //重载小于号。
{
return y>a.y;
}
};
node a[MAX_N];
bool cmp(node a,node b)
{
if(b.x==a.x) return a.y<b.y; //排序比较函数
return a.x<b.x;
}
int n,tim[MAX_N];
priority_queue<node> q;
int main()
{
node cow;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id=i;
}
sort(a,a+n,cmp);
int sum=0;
for(int i=0;i<n;i++){
if(!q.empty()&&a[i].x>q.top().y){
tim[a[i].id]=tim[q.top().id];
q.pop();
}
else{
sum++;
tim[a[i].id]=sum;
}
q.push(a[i]);
}
printf("%d\n",sum);
for(int i=0;i<n;i++)
printf("%d\n",tim[i]);
return 0;
}