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