zoukankan      html  css  js  c++  java
  • ZOJ 2724 Windows Message Queue (优先级队列,水题,自己动手写了个最小堆)

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    
    using namespace std;
    const int maxn=60000+10;
    int heap_size=0;  //堆的元素个数
    struct Node{
        char name[100];
        int para,pri;
        int t;  //用于存储信息加入的顺序,当优先级相同时,t小的先出队列
    }node[maxn];
    
    //交换node[a]和node[b]的值
    void exchange(int a,int b){
        Node tmp;
        tmp=node[a];
        node[a]=node[b];
        node[b]=tmp;
    }
    //比较node[a]和node[b],若a小于,则返回-1。
    int compare(int a,int b){
        if(node[a].pri<node[b].pri)
            return -1;
        if(node[a].pri>node[b].pri)
            return 1;
        if(node[a].t<node[b].t)
            return -1;
        if(node[a].t>node[b].t)
            return 1;
        return 0;
    }
    //维护堆,使堆保持最小堆的性质
    void heap_update(int i){
        int small;
        int l=2*i;
        int r=2*i+1;
        if(l<=heap_size && compare(l,i)<0)
            small=l;
        else
            small=i;
        if(r<=heap_size && compare(r,small)<0)
            small=r;
        if(small!=i){
            exchange(i,small);
            heap_update(small);
        }
    }
    //加入一个新元素
    void heap_insert(char str[],int para,int pri){
        heap_size++;
        strcpy(node[heap_size].name,str);
        node[heap_size].para=para;
        node[heap_size].pri=pri;
        node[heap_size].t=heap_size;
        int t=heap_size;
        while(t>1 && node[t/2].pri>node[t].pri){
            exchange(t/2,t);
            t=t>>1;
        }
    }
    //将堆顶元素出队列
    Node heap_pop(){
        Node tmp=node[1];
        node[1]=node[heap_size];
        heap_size--;
        heap_update(1);
        return tmp;
    }
    int main()
    {
        char str[5],s[110];
        Node tmp;
        int para,pri;
        while(scanf("%s",str)!=EOF){
            if(str[0]=='G'){
                if(heap_size==0){
                    printf("EMPTY QUEUE!
    ");
                }
                else{
                    tmp=heap_pop();
                    printf("%s %d
    ",tmp.name,tmp.para);
                }
            }
            else{
                scanf("%s%d%d",s,&para,&pri);
                heap_insert(s,para,pri);
            }
        }
        return 0;
    }
  • 相关阅读:
    java学习---集合框架
    java学习--java.util包中常用类
    java学习--java.lang包中常用的类
    JAVA学习--OOP
    Python入门-Hello Word
    【洛谷1452】【模板】旋转卡壳
    【洛谷2766】最长不下降子序列问题(网络流)
    【洛谷3355】骑士共存问题(网络流)
    【洛谷1251】餐巾计划问题(费用流)
    【洛谷3358】最长k可重区间集问题(费用流)
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3352183.html
Copyright © 2011-2022 走看看