题目
每个奶牛产奶的时间为A到B,每个奶牛产奶时要占用一间房子,问n头奶牛产奶共需要多少房子,并输出每头奶牛用哪间房子。
题解
贪心+优先队列
按时间顺序,如果当前有空房子则给它;要不就新建一间给它。
如果每头牛都搜一遍所有房子,太慢了!时间复杂度O(n^2)。既然每次在乎的都是空的房间,我们就开一个优先队列来存储这些房间的使用结束的时间,搞一个小根堆就好了。这样可以下降到O(nlogn)。
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5e4+10;
int n,m=0;
struct C
{
int a,b,id;
bool operator<(C c1)const
{
return a<c1.a;
}
}a[maxn];int g[maxn];
struct A
{
int end,id;
bool operator<(A a1)const
{
return end>a1.end;
}
};
priority_queue<A> q;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
a[i].id=i;
scanf("%d%d",&a[i].a,&a[i].b);
}
sort(a+1,a+n+1);
m++;
q.push((A){a[1].b,m});
g[a[1].id]=m;
for(int i=2;i<=n;i++)
{
A t=q.top();
if(a[i].a>t.end)
{
q.pop();
q.push((A){a[i].b,t.id});
g[a[i].id]=t.id;
}
else
{
m++;
q.push((A){a[i].b,m});
g[a[i].id]=m;
}
}
printf("%d\n",m);
for(int i=1;i<=n;i++)
{
printf("%d\n",g[i]);
}
return 0;
}