參考鏈結
其他結構
附上**
一開始有很多堆果子,合併兩堆果子需要數目之和的力氣,新的堆加入到果子堆裡,直到最後剩餘最後一堆。問怎樣使用力氣和最小。
很明顯的貪心思想,先挑小的合併。主要使用什麼樣的資料結構來儲存每次加入新堆再合適位置,也就是大小關係。一開始我還想用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次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。...