• 手写堆


    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1e6 + 10;
    /**
    小根堆,size个元素的序列满足 k[i] <= k[2 * i] && k[i] <= k[2 * i + 1] (1 <= i <= size / 2)
    每次去除堆顶元素,只需要重新调整为堆即可
    
    push一个元素,相当于在对应的层上插入一个元素,这条链上下面的元素对应向下移
    pop一个元素 将堆顶元素和最后一个元素交换,再重新调整堆
    调整堆  由于除了堆顶元素之外,其余结点都符合堆的条件,所以只需要把堆顶元素调整到合适的位置即可,
    交换的时候 只会影响一边,所以复杂度就相当于深度
    */
    int total_cnt;
    struct Heap {
       int data[MAXN];
       int size;
       void clear(){size = 0;}
       int get_size(){return size;}
       bool is_empty(){return size == 0;}
       void swim(int pos){
            while(pos << 1 <= size){
                int l = pos << 1;
                if(l + 1 <= size && data[l + 1] < data[l]) l++;
                if(data[l] < data[pos]){
                    swap(data[l],data[pos]);pos = l;
                }else break;
            }
       }
       void push(int value){
            data[++size] = value;
            int pos = size;
            while(pos > 1){
                if(data[pos >> 1] > data[pos]){
                    swap(data[pos >> 1],data[pos]);
                    pos >>= 1;
                }else break;
            }
       }
       int top(){return data[1];}
       void pop(){
            swap(data[1],data[size]);size--;
            swim(1);
       }
    } h ;
    char s[1010];
    
    /**
    hdu 1106测试
    */
    int main(){
    
      while(~scanf("%s",s)){
        int len = strlen(s);
        h.clear();
        int sum = 0;
        for(int i = 0;i < len;i++){
            if(s[i] != '5') sum = sum * 10 + s[i] - '0';
            else{
                if(i && s[i-1] != '5')  h.push(sum);
                sum = 0;
            }
        }
        if(s[len-1] != '5') h.push(sum);
        while(!h.is_empty()){
            if(h.get_size() == 1) printf("%d
    ",h.top());
            else printf("%d ",h.top());
            h.pop();
        }
      }
      return 0;
    }
    
  • 相关阅读:
    LeetCode 热题100 11. 盛最多水的容器
    LeetCode 热题100 21. 合并两个有序链表
    LeetCode 热题100 17. 电话号码的字母组合
    LeetCode 热题100 19. 删除链表的倒数第N个节点
    cmake 指定Cpu架构
    [学习笔记]普通平衡树(Splay)
    [原创] RestartPC64中文版v1.0.0.9
    Vue 04 谷歌浏览器配置vue开发者工具
    Vue02 Node下载安装
    springboot框架返回日期值少一天
  • 原文地址:https://www.cnblogs.com/jiachinzhao/p/7598796.html
Copyright © 2020-2023  润新知