[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\n", sugars.extract_max());
69         }
70     }
71     return 0;
72 }
时间: 2024-10-07 07:00:50

[hihoCoder] 题外话·堆的相关文章

hihocoder 1105 : 题外话&#183;堆

#1105 : 题外话·堆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho有一个糖果盒子,每过一段时间小Ho都会将新买来的糖果放进去,同时他也会不断的从其中挑选出最大的糖果出来吃掉,但是寻找最大的糖果不是一件非常简单的事情,所以小Ho希望能够用计算机来他帮忙计算这个问题! 输入 每个测试点(输入文件)有且仅有一组测试数据. 在一组测试数据中: 第1行为1个整数N,表示需要处理的事件数目. 接下来的M行,每行描述一个事件,且事件类型由该行的第一个字符表示,如果

hihocoder 1105 题外话&#183;堆 堆的应用

题目链接: 1105 一共两种操作 放入和取出(MAX)的 最多有10W次操作 ,暴力肯定会超时. 我们可以将盒子理解为一个大顶堆,即父节点大于左右子节点. 1.每次放入糖果时往上维护堆 2.取出时模仿堆排序的算法 将根节点(max)输出并与最后一个节点交换  再维护堆 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int q[100005]; void He

题外话:谈谈malloc()和free()

对于串的顺序存储,有些需要补充说明.串值的存储空间可在程序执行过程中动态分配而得.比如在计算机中存在一个自由存储区,叫做“堆”.这个堆可由C语言的动态分配函数malloc()和free()来管理. 那么今天就来点题外话,谈谈malloc()和free()威尼斯人赌场 malloc()和free()的基本概念以及基本用法 1. 函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(N

我给女朋友讲编程-题外话系列(1)--害怕过七夕,不知道买什么礼物

我女朋友在外地出差,平常能够做的就是打打电话,聊聊天. 下周六就是中国的情人节了. 说实话,也许你们觉得七夕很浪漫,但是我是有一点小恐惧,因为不知道送什么礼物给女朋友好.以前给女朋友送过一些礼物,尽管精心准备,有时难免留有遗憾. 不管怎么说,又是一次情人节,我还是需要精心准备一下,于是花时间来搜索礼物,另外也请朋友们给我出一点建议. 下面是我搜到的一些礼物,想看大图片的朋友可以单击小标题.请大家给点建议. 1, 戒指 曾经在网上买了两对情侣戒指,还刻上了双方名字首字母,满心欢喜送出去,女朋友收到

题外话-国庆期间小县城电商观察

老家在广东,工作在上海的后果就是,每年大概回两次家,国庆和春节. 县城电商观察结果是: 1,物流速度加快,电商巨头布局珠三角地区速度加快,但县城广告仍需推广. 我的家乡属于珠三角三级县城.这次回家首次体验到京东亚马逊23点前下单,次日即达的服务.且在国庆前三天,物流速度没有丝毫降低.京东县城布局已在我家乡完成,可喜可贺. 因为便携的物流,我国庆8天在京东下了四个单,都是选了自营产品,范围涵盖洗涤物品至小家电不等.爸妈及亲戚等均对京东的送货速度极为惊叹,从聊天中了解,他们基本未接触过次日达的电商物

《COM原理与应用》题外话——C++虚函数表和delete this

delete this看起来非常的奇怪,我记得在<C++ Primer>中提到过delete this,但是我已经忘了在哪了,也一直没有找到(因为没有电子版,所以一直没找到~).<C++ Primer>中提到的是在析构函数中使用delete this会造成析构函数的无限调用,最终造成栈溢出.我也在网上看了一些,很多人觉得不该使用delete this,因为会引起一些问题.但是delete this也挺有用处的,就和goto语句一样,不应该被一棍子打死(goto语句其实怪好用的:-D

BadVPN详解之--题外话:我之前自研的一个设计

说实话,这个与BadVPN无关,是我去年年初时想的一个东西,只是觉得与BadVPN类似就单列一篇文章来说,在看到BadVPN之前,我一直都想用这个思路来重构OpenVPN,无奈场面过于宏大,加之工作又再也与VPN无关,就一直搁置了,现在知道了有BadVPN这个东西,我也就再也没有必要去想这个事了,就当是个了结吧.我把我去年自研的基于OpenVPN的重构思路在本文中阐述一下,本文中我把我的这个VPN叫做ZyVPN,其实它是基于OpenVPN改的. 总览 有了前面对BadVPN和OpenVPN的介绍

back-不忘初心,方得始终。讲讲我主场3个月的经历。题外话。

终于过了这段纠结的时光,有人问,为什么要工作?可能有的人会说,为了金钱,为了生存,不得已的去工作.但是我觉得工作的意义不仅在此.如果你不热爱你的工作,你不对你的工作充满热情,你的工作不能带给你成就感.那么你一定没有找到适合你的工作. 3个月了,一直在万达驻场,说实话,很累.尤其对于我一个刚工作仅仅一年的人来说,第一次这样的经历.996可能你会觉得很恐怖,但是,我的是997,好像到现在已经连续上班一个月没休息了.不论是身体,还是工作状态都相对差了好多.也许会有一些老司机懂得一些套路,该偷懒偷懒啊.

题外话:Lua脚本语言存在的意义

纯属个人见解. 大致来说:c/c++执行效率高,游戏中一些性能敏感的复杂计算需要用c/c++来实现,防止游戏卡顿和低帧率.这些复杂计算包括战斗逻辑,复杂AI,骨骼动画蒙皮骨骼点的坐标计算等等.但c++是一种比较复杂的编程语言,开发效率较低.嘛,不过这不是主要问题,对于商业手游项目只用c++开发,是致命的.这一点在后边lua具体说明. lua是脚本语言,执行效率不及c/c++,往往用来实现性能不敏感的游戏逻辑,比如窗口界面等等.另外lua语法简单,开发效率高,没有编程背景的策划花精力后也可以掌握,