1. 程式人生 > >2017級演算法第二次上機-B.女媧加農炮

2017級演算法第二次上機-B.女媧加農炮

這道題本質上還是最經典的優先佇列的使用的例題:合併果子。

借用這道題總結複習一下優先佇列。

優先佇列的標頭檔案:<queue>

升序佇列
priority_queue <int,vector<int>,greater<int> > q;
降序佇列
priority_queue <int,vector<int>,less<int> >q;

注意優先佇列有升序版本的 也有降序版本的

接下來說明一下優先佇列常用的方法:

q.empty() 如果佇列為空,則返回true,否則返回false 注意這個函式的返回值是bool型別的

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

q.pop() 刪除隊首元素 但不返回其值 

q.top() 返回具有最高優先順序的元素值 但不刪除該元素

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

二維元素的合併果子:

#include <algorithm>
#include <iostream>
#include <queue>

using namespace std;
priority_queue <int , vector<int> , greater<int
> > p;//升序佇列 priority_queue <int , vector<int> , less<int> > q;//降序佇列 int main(){ int n,num,i,x,y; long long ans=0; while(~scanf("%d",&n)){ while(!p.empty()) p.pop(); for(i=1;i<=n;i++){ scanf("%d",&num); p.push(num); } ans
=0; for(i=1;i<n;i++){ x = p.top();p.pop(); y = p.top();p.pop(); ans +=x+y; p.push(x+y); } printf("%lld\n",ans); } return 0; }

有一些是小的trick 比如在使用優先佇列之前要清空(clear)

while(q.empty() == false ){

  q.pop();

}