STL C ++: Подробная очереди старшинства

  Куча является очень важной структурой данных, то, как мы быть более краткими, чтобы написать большой корень / корневую небольшую кучу этого?

  Для многих языков, это может только шаг за шагом, рукопашного боя, но для C ++, запись большой корень корешки куча гораздо проще, потому что C ++ имеет контейнер называется priority_queue, контейнер и очередь включены в файл заголовка <очереди> в , то priority_queue контейнера под названием очередь приоритета может быть смоделирована, контейнер может быть ваши входные данные сохраняются последовательно в контейнере, вставка и удаление элементов, работающих элементы временной сложности войти N, но в верхней части элементов стеки в запросе (скорее значение) время сложность O (1), вставка и удаление с помощью: a.push (х) и a.pop () для возврата в рабочий элемент находится в верхней части стека (a.top), так как приоритетной очереди собственные характеристики, свой собственный писать только большой корень кучи, но когда входные данные, если мы стали его визави, то число на выходе восстанавливается, так что вы можете быть в очереди приоритетов в небольшой корень кучи, конечно, мы можем также перегружен < «достичь.

  Вот родственная проблема воды:

Название Описание

В саде, многий сбиты все фрукты, а также различные виды фруктов в разные кучи. Мы решили положить много фруктов все синтетический ворсу.

Каждый комбинированный, плодовые много могут быть объединены вместе сваи, потребляют физическую силу , равную весу плода и сваи. Как можно видеть, все фрукты через  1-н - н- - После слияния 1, на левой стопке. Когда много фруктов в сочетании общего потребления физической силы равно сумме каждого комбинированное потребление.

Но и потому , что эти плоды прилагают большие усилия , чтобы вернуться домой, так много , чтобы сэкономить энергию во время слияния фруктов , как это возможно. Предположим , что каждый вес плодов являются  номер 1, а также количество и тип плода , известного в каждом плоде, ваша задача состоит в том, чтобы разработать комбинированный заказ программы, так что много физической мере стоимости, и выводит минимальное значение физической стоимости ,

Так , например  . 3 три вида фруктов, с последующим номером  . 1 2 . 9 9 Может первым  . 1 2 2 в сочетании стек, стек новый номер  . 3 -таксировать  . 3 3 После этого новый стек и третий стек в сочетании оригинала, и дать новый стек, число  12 . 1 2 таксировать  12 . 1 2 Поэтому, много общего взимание налогов  = 12 + 3 = 15 = 3 + . 1 2 = 1 . 5 Можно доказать  15 . 1 5 наименьшее значение физической стоимости.

Формат ввода

В общей сложности из двух линий.
Первая строка представляет собой целое число  п (. 1 \ п-Leq \ 10000 Leq) н- ( . 1 n - . 1 0 0 0 0 ), представляет собой количество видов фруктов.

Вторая строка содержит  n- п-целые числа, разделенные пробелами, первый  I я целое  a_i (. 1 \ Leq a_i \ Leq 20000) Я ( . 1 I 2 0 0 0 0 ) является первым  я я вид фруктов номер.

Формат вывода

Целое число, т.е. значения минимальной физической стоимости. Убедитесь , что входные данные меньше , чем  2 ^ {31} 2 . 3 1

Пример ввода и вывода

Input # 1
3 
1 2 9
Выход # 1
15

Описание / Советы

За 30% данных, чтобы гарантировать , что есть п \ Le 1000 н- 1. 0 0 0:

Для 50% данных, чтобы гарантировать , что есть п \ Le 5000 н- 5. 0 0 0;

Для всех данных, чтобы гарантировать , что существует п \ 10000 Le n- . 1 0 0 0 0.

 

  Это проблема, в 2004 году NOIP улучшить группу, мы думали, основываясь на жадности, каждый теперь будет иметь как минимум две фруктового комбинации кучи, мы можем гарантировать, что каждый шаг является оптимальным, мы можем использовать небольшой корень кучи достичь, каждый из всплывающего окна как минимум из двух элементов, то они являются плодом объединенного значения, а затем в стек свалили.

Код:

#include <iostream> 
#include <cstdio> 
#include <очереди>
 с использованием  пространства имен зЬй; 
priority_queue < INT > а;
длинное  длинное ANS = 0 ;
INT основных () {
     INT п, х;    
    CIN >> п; 

    для ( INT I = 1 ; г <= п; я ++) CIN >> х, a.push (- х);
    для ( INT I = 1 ; <п; я ++ ) {
         Int к = - a.top (); 
        a.pop (); 
        ИНТ у = -a.top (); 
        a.pop (); 
        ANS + = к + J; 
        a.push ( -K- к); 
    }         
    СоиЬ << анс << епсИ; 
}

 

 

 

Спасибо за чтение

 

 

 

  

рекомендация

отwww.cnblogs.com/tianbowen/p/11390843.html