题目大意:机房管理员负责锁机器,然后对于每一个来机房的人,机房管理员就要给他解锁一台机器,然后他走的时候再锁上机器。为了简化这个繁杂的任务,对于每一个上机完后走的人,不锁机器,在机器m分钟后自动锁定。输入来上机的人数和机器m秒后自动锁定。然后输入每一个人来上机的时间和持续的时间。输出机器不需要解锁的次数(就是人的总次数-机器解锁的次数)
结构体记录每一个人来的时间和走的时间,用一个优先队列存下每一个人离开的时间,然后对于每一个来的人,有三种情况:第一种来的时间再pq.top()前面,此时还有人在用机器,所以需要给他分配另一台机器,相应的也需要解锁。第二种来的时间再pq.top()和pq.top()+m之间,表示有一台机器没有人用又没有锁,他就用这一台,此时不需要解锁,第三种,来的时间大于pq.top()+m,表示他来的时候有的机子已经上了锁,所以就要用pop()来找到一个机子符合第二种情况,如果没有这种的,则需要解锁一台新机子。
一开始输入崩了,找了很久发现第二个循环while的时候&&短路了,换了一次顺序AC。
附上AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=300000+5;
int n,m;
priority_queue<int,vector<int>,greater<int> >pq;
struct node{
int x,y;
}nodes[maxn];
bool cmp(const node& a,const node& b)
{
return a.x<b.x;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;++i)
{
scanf("%d%d",&nodes[i].x,&nodes[i].y);
nodes[i].y+=nodes[i].x;
}
sort(nodes,nodes+n,cmp);
int ans=0;
while(!pq.empty()) pq.pop();
for(int i=0;i<n;++i)
{
while(!pq.empty()&&nodes[i].x>(pq.top()+m))
pq.pop();
if(pq.empty()||pq.top()>nodes[i].x)
{
++ans;
pq.push(nodes[i].y);
}
else
{
pq.pop();
pq.push(nodes[i].y);
}
}
printf("%d\n",n-ans);
}
return 0;
}