HDU 2474 Process scheduling(优先队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2474

题意:银行家算法。最多3种资源。判断是否安全?

思路:设置三个优先队列,一开始将所有进程放进1队列,满足第一种资源的从1队列中挪到2队列,满足第二种资源的从2队列中挪到3队列。每次从3队列中删除满足第三种资源的,回收已经分配的资源,之后更新1、2队列。

 




i64 a[N][3],b[N][3],c[3];


struct node
{
    int id;
    i64 x;
    
    node(){}
    node(int _id,i64 _x)
    {
        id=_id;
        x=_x;
    }
    
    int operator<(const node &p)const
    {
        return x>p.x;
    }
};


priority_queue<node> Q1,Q2,Q3;
int n,m;


void init()
{
    while(!Q1.empty()) Q1.pop();
    while(!Q2.empty()) Q2.pop();
    while(!Q3.empty()) Q3.pop();
    int i;
    FOR1(i,n) Q1.push(node(i,b[i][0]));
    
    while(!Q1.empty()&&Q1.top().x<=c[0]) 
    {
        i=Q1.top().id;
        Q2.push(node(i,b[i][1]));
        Q1.pop(); 
    }
    while(!Q2.empty()&&Q2.top().x<=c[1])
    {
        i=Q2.top().id;
        Q3.push(node(i,b[i][2]));
        Q2.pop();
    } 
}


void update()
{
    int i;
    while(!Q1.empty()&&Q1.top().x<=c[0]) 
    {
        i=Q1.top().id;
        Q2.push(node(i,b[i][1]));
        Q1.pop(); 
    }
    while(!Q2.empty()&&Q2.top().x<=c[1])
    {
        i=Q2.top().id;
        Q3.push(node(i,b[i][2]));
        Q2.pop();
    } 
}


int main()
{
    Rush(n)
    {
        RD(m);
        int i,j;
        clr(a,0); clr(b,0); clr(c,0);
        FOR0(i,m) FOR1(j,n) RD(a[j][i]);
        FOR0(i,m) FOR1(j,n) RD(b[j][i]);
        FOR0(i,m) RD(c[i]);
        init();
        int x=0;
        node p;
        while(!Q3.empty()&&Q3.top().x<=c[2])
        {
            p=Q3.top();
            Q3.pop();
            FOR0(i,3) c[i]+=a[p.id][i];
            update();
            x++;
        }
        if(x==n) puts("Yes");
        else puts("No");
    }
}

你可能感兴趣的:(process)