优先队列没有学好所以程序有些地方写的比较混乱,
sort和优先队列都要用的时候感觉还是写运算符重载代码更加简洁。
思想就是把牛按照挤奶时间从小到大排序,从最早挤奶的牛开始,寻找可放置的畜栏,放入后修改畜栏的挤奶结束时间。畜栏存入优先队列按照结束时间从小到大排序,这样在给牛查找畜栏的时候只要检查第一个畜栏是否可以放入即可。
#include <iostream>
#include <algorithm>
#include<cstdio>
#include<vector>
#include <queue>
using namespace std;
class Cow
{
public:
int a,b; //挤奶的起点终点
int No;
};
Cow cow[50100];
int pos[50100]; //第i头奶牛被放到哪个畜栏
bool myfunction (Cow i, Cow j)
{
return (i.a < j.a);
}
class Stall
{
public:
int s; //结束时间
int No;
Stall(int end, int n)
{
s = end;No = n;
}
};
struct cmp
{bool operator()(Stall a,Stall b) { return a.s > b.s; }
};
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i = 0; i < n; ++i)
{
scanf("%d%d",&cow[i].a,&cow[i].b);
cow[i].No = i;
}
sort(cow,cow+n,myfunction);
//按照奶牛的开始时间来排序(升序)
priority_queue<Stall,vector<Stall>,cmp> pq;
//创建优先队列存放畜栏
int total = 0;
//畜栏总数
for(int i = 0; i < n; ++i)
//从最早开始挤奶的奶牛开始算
{
if(pq.empty())
//如果还没有畜栏
{
++total; //建立畜栏
pq.push(Stall(cow[i].b,total));
//建立畜栏放入结束时间并且编号
pos[cow[i].No] = total;
}
else
{
Stall ff = pq.top();
if(ff.s < cow[i].a)
{
pq.pop();
pq.push(Stall(cow[i].b,ff.No));
pos[cow[i].No] = ff.No; //现有畜栏编号
}
else
{
++total;
pq.push(Stall(cow[i].b,total));
//建立畜栏放入结束时间并且编号
pos[cow[i].No] = total; //新建畜栏的编号
}
}
}
cout << total <<endl;
for(int i = 0; i < n; ++i)
{
cout << pos[i];
if(i != n-1)
cout << endl;
}
}
return 0;
}