题意:
有n头牛需要挤奶,一个畜栏同一时间只能容纳一头牛,给定每头牛挤奶的时间区间[A,B],问至少需要多少个畜栏才能完成全部挤奶工作,以及每头牛都安排在哪个畜栏里。
思路:
将挤奶区间按照开始时间从小到大排序,用小根堆来维护畜栏信息,将第一头牛安排在第一个畜栏,对之后的每一头牛进行如下判断:若挤奶开始时间大于堆顶元素的时间则将堆顶元素的时间更新为这头牛挤奶的结束时间,否则将这头牛挤奶的结束时间压入堆内并使畜栏个数加一。
代码实现:
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct section{
int id;
int s;
int e;
section(){}
section(int ii,int ss,int ee):id(ii),s(ss),e(ee){}
friend bool operator<(const section &s1,const section &s2){
return s1.s<s2.s;
}
};
struct stall{
int id;
int e;
stall(){}
stall(int ii,int ee):id(ii),e(ee){}
friend bool operator<(const stall &s1,const stall &s2){
return s1.e>s2.e;
}
};
int n,num,a,b;
section cows[50010];
int res[50010];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++){
cin>>cows[i].s>>cows[i].e;
cows[i].id=i;
}
sort(cows,cows+n);
num=1;
priority_queue<stall> q;
q.push(stall(1,cows[0].e));
res[cows[0].id]=1;
for(int i=1;i<n;i++){
stall t=q.top();
if(cows[i].s>t.e){
q.pop();
q.push(stall(t.id,cows[i].e));
res[cows[i].id]=t.id;
}
else{
num++;
q.push(stall(num,cows[i].e));
res[cows[i].id]=num;
}
}
cout<<num<<endl;
for(int i=0;i<n;i++)
cout<<res[i]<<endl;
return 0;
}