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;
    }
  • 相关阅读:
    matlab中 数据保留有效位数
    matlab的m程序转执行文件exe
    MFC创建好的对话框如何移植到新程序中
    STM32 ADC转换时间
    MFC修改窗口无标题和标题信息,修改执执行文件图标
    兔子慢的原因
    core2.1独立布署,报错的原因。
    修复安卓的bug
    2018-11-21 ko.pureComputed的使用
    2018-11-17 js的this引起的血案
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3352183.html
Copyright © 2011-2022 走看看