zoj2724 堆的插入调整

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>

using namespace std;

const int M = 60005;

struct node{

    char name[50];
    int para;
    int pri,t;

}p[M];
int heap[M];
int used, top;

int check(int p1, int p2) {

    if(p[p1].pri < p[p2].pri)
        return -1;
    if(p[p1].pri > p[p2].pri)
        return 1;
     if(p[p1].t < p[p2].t)
        return -1;
     if(p[p1].t > p[p2].t)
        return 1;
  return 0;
}

int main()
{
    char str[100];
    used = 0;
    top = 0;
    int cnt = 0;
    while(scanf("%s", str) != EOF) {

        if(strcmp(str,"GET") == 0){

            if(top){

                printf("%s %d\n", p[heap[1]].name, p[heap[1]].para);
                 int k = 1;
                heap[k] = heap[top--];
                while(k * 2 <= top) {

                    int t = k*2;
                    if(t < top && check(heap[t+1], heap[t]) < 0)
                       t++;
                    if(check(heap[t], heap[k]) < 0){

                       swap(heap[t], heap[k]);
                       k = t;

                    }else{

                        break;
                    }

                }
            }else {

                printf("EMPTY QUEUE!\n");
            }

        }else {

            scanf("%s%d%d", p[used].name, &p[used].para, &p[used].pri);
            p[used].t = cnt++;
            int k = ++top;
            heap[k] = used++;

            while(k > 1) {

                int t = k/2;
                if(check(heap[t], heap[k]) > 0){

                    swap(heap[t], heap[k]);
                    k = t;
                }else {

                    break;
                }
            }
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值