AcWing 111. 畜栏预定
原题链接
简单
作者:
一天不A浑身难受
,
2021-03-13 11:22:24
,
所有人可见
,
阅读 402
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<int,int>pii;
const int N = 1e6;
int n;
int id[N];
pair<pii,int> cow[N]; //牛的进食时段、牛的编号
int main()
{
cin>>n;
for(int i=0;i<n;i++){
int l,r;
cin>>l>>r;
cow[i] = {{l,r},i};
}
sort(cow,cow + n); //按进食时间段左端点排序
int num = 1;
priority_queue<pii,vector<pii>,greater<pii>>heap;
heap.push({cow[0].first.second,num}); //heap 的第一个值为进食的结束时间,第二个为编号
id[cow[0].second] = 1;
for(int i =1;i<n;i++) //第一头牛已经考虑了,从第二头开始
{
int l = cow[i].first.first; //牛的开始进食的时间
int r = cow[i].first.second;//牛的结束进食的时间
int cowNum = cow[i].second; //牛的编号
if(l>heap.top().first) //如果牛的开始进食时间大于另一头牛的结束进食时间了,则这头牛可以放入畜栏
{
int t = heap.top().second; //记录一下这个围栏的编号
heap.pop();
heap.push({r,t});
id[cowNum] =t; //记录这只牛所属围栏号
}
else
{
heap.push({r,++num});
id[cowNum] = num;
}
}
cout<<heap.size()<<endl;
for(int i = 0;i<n;i++)
cout<<id[i]<<endl;
}