luogu p1090 合併果子

2021-10-01 21:20:21 字數 3619 閱讀 2233

參考鏈結

其他結構

附上**

一開始有很多堆果子,合併兩堆果子需要數目之和的力氣,新的堆加入到果子堆裡,直到最後剩餘最後一堆。問怎樣使用力氣和最小。

很明顯的貪心思想,先挑小的合併。主要使用什麼樣的資料結構來儲存每次加入新堆再合適位置,也就是大小關係。一開始我還想用set,因為set有這有序的天然優勢,可是set不能儲存相同的值,被pass掉,那到底有沒有一種可以儲存自帶順序的結構呢?有的,一開始愚蠢沒想到,那就是優先佇列:

priority_queue<

int,vector<

int>

, greater<

int>

> q;

那這道題基本就解決了,那要是這樣,我肯定不寫這篇題解了。這裡介紹下本題引申的優先佇列和其他做法。

#include

using namespace std;

priority_queue<

int,vector<

int>

,greater<

int>

> q;

intmain()

cout

}

佇列是一種先進先出的資料結構,元素在隊尾加入,從隊頭彈出。而優先佇列,元素被賦予優先順序。優先佇列具有最高端先出的特點。

下面介紹優先佇列常用操作和自定義比較。

q.empty()     //如果隊列為空返回true,否則返回false

q.size() //返回佇列元素個數

q.pop() //刪除隊首元素,沒有返回值

q.top() //返回隊首元素

q.push(item) //在基於優先順序的適當位置插入

1. 預設優先順序:

#include

using namespace std;

priority_queue<

int>q;

通過《操作符元素大優先順序高,從大到小.

2. 傳入比較函式,標頭檔案需包括functional.

#include

#include

using namespace std;

priority_queue<

int, vector<

int>

, greater<

int>

> q;

此時從小到大.

3.傳入比較結構體,自定義優先順序.

#include

using namespace std;

struct cmp};

/**struct cmp

/* 這樣寫也可以

bool operator < (const node &a) const

*/};

/**因為標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。而且自定義型別的《操作符與》操作符並無直接聯絡,故會編譯不過。

struct node

};**/

priority_queue q;

c++ stl優先佇列常用用法

堆,小根堆:

若樹根結點存在左孩子,則根結點的值(或某個域的值)小於等於左孩子結點的值(或某個域的值);

若樹根結點存在右孩子,則根結點的值(或某個域的值)小於等於右孩子結點的值(或某個域的值);

以左、右孩子為根的子樹又各是乙個堆。

類模板,模板的型別引數由關鍵字class 或關鍵字typename 及其後的識別符號構成。在模板參數列中關鍵字class 和typename 的意義相同。(在標準c++之前關鍵字typename 沒有被支援 ,把這個關鍵字加入到c++中的原因是因為有時必須要靠它來指導編譯器解釋模板定義。),是對一批僅僅成員資料型別不同的類的抽象,程式設計師只要為這一批類所組成的整個類家族建立乙個類模板,給出一套程式**,就可以用來生成多種具體的類,(這類可以看作是類模板的例項),從而大大提高程式設計的效率。————360百科

#include

template

class smallest_heap

;template

smallest_heap::

smallest_heap()

template

void smallest_heap::

push

(item const

&n)}

template

void smallest_heap::

pop(

)else

break;}

}template

item smallest_heap::

top(

)template

int smallest_heap::

size()

template

bool smallest_heap::

empty()

#include

template

class largest_heap

;template

largest_heap::

largest_heap()

template

void largest_heap::

push

(item const

&n)}

template

void largest_heap::

pop(

)else

break;}

}template

item largest_heap::

top(

)template

int largest_heap::

size()

template

bool largest_heap::

empty()

;template

smallest_heap::

smallest_heap()

template

void smallest_heap::

push

(item const

&n)}

template

void smallest_heap::

pop(

)else

break;}

}template

item smallest_heap::

top(

)template

int smallest_heap::

size()

template

bool smallest_heap::

empty()

smallest_heap<

int> h;

int n,ans;

intmain()

while

(h.size()

>1)

cout

}

luoguP1090合併果子

解決方案 1.一看就知道最方便的是貪心 動歸也行 2.每次調最小的兩個合併 不要問證明 3.所以用優先佇列,懶得手打 p黨www 4.小根堆和大根堆都差不多,選乙個用吧 5.ac 奉上 include include includeusingnamespacestd priority queue i...

洛谷 1090 合併果子

合併果子 有n堆果子,第i堆果子數量為c i 每次合併操作能合併任意兩堆果子a與b,消耗的能量為c a c b 目標是不斷進行合併操作將所有果子合併為一堆,求出如何才能使消耗的能量最小。輸入第一行為果子堆數n 輸入第二行有n個整數,表示第i堆果子的數量 輸出有一行,消耗的最小能量 保證結果小於2 3...

P1090 合併果子

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。...