库特摘果子——优先队列

Posted zhuyukun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了库特摘果子——优先队列相关的知识,希望对你有一定的参考价值。

技术图片

 

 这个用优先队列就可以了。

在这里补充一点优先队列和队列的知识。

 优先队列

大根堆:从大到小排列。
小根堆:从小到大排列。
优先队列就是堆,也可以自己手写堆。
// 小根堆的写法
priority_queue<int,vector<int>,greater<int> > vis;
// 大根堆的写法
priority_queue<int,vector<int>,less<int> > vis;

(注意要和sort的写法分开,正好和sort相反。)

也可以用结构体。

定义一个priority_queue 的方法为:
priority_queue<type> name;//type 通常为结构体

举个例子:

struct sa
{
    int num;
    int time;
};
bool operator<(const sa &a,const sa &b)//固定格式,a和b自己命名就行了。这个为判断优先队列咋排序。
{
    return a.sum<b.sum;//表示的是从大到小
}
priority_queue<sa>vis;//sa为数据类型,vis为优先队列的名字,可以随便起。

vis.push()//从队尾入队列
vis.pop()//从队首出队列
vis.top()//队首
vis.empty()//判断队列是否为空
vis.size()//判断队列中元素的数量

队列

 队列的基本操作:
(1)初始化队列 queue<int>vis ,定义一个队列
(2)入队 vis.push(x)
(3)出队 vis.pop()
(4)判断队列是否为空 vis.empty()
(5)判断队列中元素的数量vis.size()
(6)得到队列的队首元素 vis.front()
综上: #include <queue>
用<bits/stdc++.h>则无需考虑头文件。

————————————————————————————————————————

接下来我们看上面这道题吧

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
 long long   a[N];
int main()
{
    int  n,x,l;
    while(~scanf("%d",&n))
    {
       l=0;
        priority_queue<long long,vector<long long>,greater<long long> >vis;
        for(int i=1;i<=n;i++)
        {
            cin>>x;
            vis.push(x);
        }
        for(int i=1;i<n;i++)
        {
            long long s1=vis.top();
            vis.pop();
            long long  s2=vis.top();
            vis.pop();
            a[++l]=s1+s2;
            vis.push(s1+s2);
        }
        printf("%lld",a[1]);
        for(int i=2;i<=l;i++)
            printf(" %lld",a[i]);
            printf(" ");
    }
return 0;
}
这个题倒不难,主要是注意数据的类型。要定成long long型。否则会wa。

提供个链接,可以做一下。

http://acm.nefu.edu.cn/problemShow.php?problem_id=2110

 

以上是关于库特摘果子——优先队列的主要内容,如果未能解决你的问题,请参考以下文章

合并果子(优先队列2种)

优先队列合并果子

codevs 1063 合并果子//优先队列

洛谷-合并果子-优先队列

luoguP1090 合并果子 (贪心+优先队列)

合并果子