题目是POJ3190
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
struct dd
{
int l;
int r;
int ps;
friend bool operator<(struct dd k1,struct dd k2)
{
return k1.r>k2.r;
}
}a[50005];
typedef struct dd dd;
bool cmp(dd a,dd b)
{
if(a.l==b.l)
return a.r>b.r;
else
return a.l<b.l;
}
int a1[50005];
int main()
{
int i,j,m,n;
while(scanf("%d",&m)!=EOF)
{
int need=1;
for(i=0;i<m;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].ps=i;
}
sort(a,a+m,cmp);
priority_queue<dd> q;
q.push(a[0]);
a1[a[0].ps]=1;
for(i=1;i<m;i++)
{
if(a[i].l<=q.top().r)
a1[a[i].ps]=++need;
else
{
a1[a[i].ps]=a1[q.top().ps];
q.pop();
}
q.push(a[i]);
}
printf("%d\n",need);
for(int i=0;i<m;i++)
printf("%d\n",a1[i]);
}
return 0;
}
题目的意思是一些奶牛,他们在固定的时间挤奶,问最少需要几台机器能完成全部的工作。
首先 先对左边的起始时间进行排序号,然后再从右边的时间开始,一一入队,队列使用优先队列,根据右边时间结束短的放队列的头,如果下一个时间比头时间短就入队,然后机器数目+1,如果右端的时间大于等于头时间,有抛弃队首,然后将这个时间入队列。
priority_queue<int, vector<int>, greater<int> > qi2;//从小到大的优先级队列,可将greater改为less,即为从大到小