zoukankan      html  css  js  c++  java
  • [hihoCoder] 题外话·堆

    A direct applicatin of the heap data structure. Specifically, a max heap is used. The required functions include insertion of a node to the heap and extraction of the maximum element of the heap. Each time you insert or remove an element to or from the heap, you need to maintain the max heap property.

    The code is as follows.

    If you want to learn more about heap, you may refer to this passage.

     1 #include <iostream>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 class Heap {
     7 public:
     8     Heap() {
     9         data.clear();
    10     }
    11 
    12     inline int parent(int idx) {
    13         return (idx - 1) >> 1;
    14     }
    15 
    16     inline int left(int idx) {
    17         return (idx << 1) + 1;
    18     }
    19 
    20     inline int right(int idx) {
    21         return (idx << 1) + 2;
    22     }
    23 
    24     void max_heapify(int idx) {
    25         int largest = idx;
    26         int l = left(idx), r = right(idx);
    27         if (l < (int)data.size() && data[l] > data[largest]) largest = l;
    28         if (r < (int)data.size() && data[r] > data[largest]) largest = r;
    29         if (largest != idx) {
    30             swap(data[idx], data[largest]);
    31             max_heapify(largest);
    32         }
    33     }
    34 
    35     void insert(int elem) {
    36         data.push_back(elem);
    37         int idx = data.size() - 1;
    38         while (idx >= 0 && parent(idx) >= 0 && data[parent(idx)] < data[idx]) {
    39             swap(data[parent(idx)], data[idx]);
    40             idx = parent(idx);
    41         }
    42     }
    43 
    44     int extract_max(void) {
    45         int maximum = data[0];
    46         swap(data[0], data[data.size() - 1]);
    47         data.erase(data.end() - 1, data.end());
    48         max_heapify(0);
    49         return maximum;
    50     }
    51 
    52 private:
    53     vector<int> data;
    54 };
    55 
    56 int main(void) {
    57     int events;
    58     while (scanf("%d", &events) != EOF) {
    59         Heap sugars;
    60         for (int i = 0; i < events; i++) {
    61             char order[2];
    62             scanf("%s", order);
    63             if (order[0] == 'A') {
    64                 int sugar;
    65                 scanf("%d", &sugar);
    66                 sugars.insert(sugar);
    67             }
    68             else printf("%d
    ", sugars.extract_max());
    69         }
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    zhanwei
    站位
    Web前端开发:SQL Jsp小项目(二)------添加修改
    Web前端开发:SQL Jsp小项目(一)
    JDBC(用Eclipse操作数据库Oracle)的基础操作集合
    Thread多线程stopSleep顺序问题
    IO流详解之代码详解
    IO流详解(半教材类型)
    用JQuery编写textarea,input,checkbox,select
    Java编写ArrayBasic制作一个简单的酒店管理系统
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4558659.html
Copyright © 2011-2022 走看看