题意:给定n只牛以及他们的挤奶时间,求用的最少的机器数量,以及每只奶牛用的机器编号。
我们按照开始时间排序,因为越早开始,如果我在这个时候找不到空闲机器,那么肯定是要安排新的机器,因为开始时间越晚,结束时间必定是比开始时间晚的。用优先队列按照结束时间从小到大存储,当遇到一个某个开始时间大于最小结束时间,那么这个机器就可以被重复使用。
num存储的是对于某个编号的奶牛使用的机器编号。
#include<string.h>
#include<stdio.h>
#include<cmath>
#include<iostream>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
class node
{
public:
int s,e,x;
bool operator < (const node &a)const
{
return e>a.e;
}
}s[55000];
bool cmp(node a,node b)
{
return a.s<b.s;
}
int num[55000];
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&s[i].s,&s[i].e);
s[i].x=i+1;
}
sort(s,s+n,cmp);
priority_queue<node> q;
int ans=1;num[s[0].x]=1;
q.push(s[0]);
for(int i=1;i<n;i++)
{
node x=q.top();
if(x.e<s[i].s)
{
q.pop();
q.push(s[i]);
num[s[i].x]=num[x.x];
}
else
{
ans++;
num[s[i].x]=ans;
q.push(s[i]);
}
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)
printf("%d\n",num[i]);
}
return 0;
}
也可以set容器做。不过这个题目上时间比优先队列多了快一倍了- -
#include<string.h>
#include<stdio.h>
#include<cmath>
#include<iostream>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
class node
{
public:
int s,e,x;
bool operator < (const node &a)const
{
//return e>a.e;
return e<a.e;
}
}s[55000];
bool cmp(node a,node b)
{
return a.s<b.s;
}
int num[55000];
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&s[i].s,&s[i].e);
s[i].x=i+1;
}
sort(s,s+n,cmp);
multiset<node> q;
q.clear();
int ans=1;num[s[0].x]=1;
q.insert(s[0]);
for(int i=1;i<n;i++)
{
node x=*q.begin();
if(x.e<s[i].s)
{
q.erase(q.begin());
q.insert(s[i]);
num[s[i].x]=num[x.x];
}
else
{
ans++;
num[s[i].x]=ans;
q.insert(s[i]);
}
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)
printf("%d\n",num[i]);
}
return 0;
}