2017級演算法第二次上機-B.女媧加農炮
阿新 • • 發佈:2018-12-10
這道題本質上還是最經典的優先佇列的使用的例題:合併果子。
借用這道題總結複習一下優先佇列。
優先佇列的標頭檔案:<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();
}