UVALive - 7423 Assigning Workstations(贪心法+优先队列)

点击打开题目链接



题目大意:机房管理员负责锁机器,然后对于每一个来机房的人,机房管理员就要给他解锁一台机器,然后他走的时候再锁上机器。为了简化这个繁杂的任务,对于每一个上机完后走的人,不锁机器,在机器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;
}

posted @ 2017-04-05 11:14  猪肛鬣  阅读(344)  评论(0编辑  收藏  举报