• hihocoder 1105 : 题外话·堆


    #1105 : 题外话·堆

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Ho有一个糖果盒子,每过一段时间小Ho都会将新买来的糖果放进去,同时他也会不断的从其中挑选出最大的糖果出来吃掉,但是寻找最大的糖果不是一件非常简单的事情,所以小Ho希望能够用计算机来他帮忙计算这个问题!

    输入

    每个测试点(输入文件)有且仅有一组测试数据。

    在一组测试数据中:

    第1行为1个整数N,表示需要处理的事件数目。

    接下来的M行,每行描述一个事件,且事件类型由该行的第一个字符表示,如果为'A',表示小Ho将一粒糖果放进了盒子,且接下来为一个整数W,表示这颗糖果的重量;如果为'T',表示小Ho需要知道当前盒子中最重的糖果的重量是多少,在知道这个值之后,小Ho会将这颗糖果从盒子中取出并吃掉。

    对于100%的数据,满足1<=N<=10^5, 1<=w<=10^5。<>

    对于100%的数据,满足没有2颗糖果的重量是相同的,最开始的时候小Ho的糖果盒子是空的,且每次小Ho想要取出一颗糖果的时候盒子里一定至少有一颗糖果。

    输出

    在一组测试数据中:

    对于每个类型为'T'的时间,输出1个整数W_MAX,表示在这一时刻,盒子中最重的糖果的重量。

     

    样例输入
    5
    A 77751
    A 1329
    A 26239
    A 80317
    T
    
    样例输出
    80317



    分析:方法一:用C++的STL中优先队列,priority_queue.
     1 #include <iostream>
     2 #include <queue>
     3 using namespace std;
     4 int main(){
     5     priority_queue<int> que;
     6     int n, w;
     7     char c;
     8     cin >> n;
     9     while(n--){
    10         cin >> c;
    11         if(c == 'A'){
    12             cin >> w;
    13             que.push(w);
    14         } else if (c == 'T') {
    15             cout << que.top() << endl;
    16             que.pop();
    17         }
    18     }
    19     return 0;
    20 }
    
    

    方法二:自己建立一个大根堆。用一维数组

     1 #include <cstdio>
     2 #include <iostream>
     3 using namespace std;
     4 
     5 int heap[100005], size = 0;
     6 //第一个元素的下标为1.
     7 void push(int x){
     8     int i = ++size;
     9     while(i > 1){
    10         int p = i / 2;
    11         if(heap[p] >= x)
    12             break;
    13         heap[i] = heap[p];
    14         i = p;
    15     }
    16     heap[i] = x;
    17 }
    18 
    19 int pop(){
    20     //最大值
    21     int ret = heap[1];
    22     //要提到根的值
    23     int x = heap[size--];
    24     int i = 1;
    25     while(2 * i + 1 <= size){
    26         int a = 2 * i, b = 2 * i + 1;
    27         if(heap[b] > heap[a])
    28             a = b;
    29         if(x >= heap[a])
    30             break;
    31         heap[i] = heap[a];
    32         i = a;
    33     }
    34     heap[i] = x;
    35     
    36     return ret;
    37 }
    38 
    39 int main(){
    40     int n, w;
    41     char c;
    42     cin >> n;
    43     while(n--){
    44         cin >> c;
    45         if(c == 'A'){
    46             cin >> w;
    47             push(w);
    48         } else {
    49             cout << pop() << endl;
    50         }
    51     }
    52     return 0;
    53 }
     
  • 相关阅读:
    手机蓝牙各类服务对应的UUID
    Android数据传递的四种方法
    PS延迟显示的解决方法
    字符串分离函数
    利用cmd命令创建wifi热点
    我的毕业设计——无线控制平台
    只需简单一步,android自带的示例程序 BluetoothChat 变蓝牙串口助手
    volatile 关键字
    PC蓝牙开发笔记
    Jquery与CSS中的大于符号
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/5854393.html
Copyright © 2020-2023  润新知