使用优先队列:
优先队列简介:
http://www.cplusplus.com/reference/stl/ 所有STL容器和STL algorithm的所有函数。
优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则,不能重载“>”操作符。
使用优先队列时也需要声明头文件“
#include <queue>
”
优先队列是用heap完成的,支持O(log n)的入队和出队操作;
STL优先队列priority_queue<int,vector<int>,greater<int> >中greater建立的顺序是从小到大排列,而less则是从大到小排列。另外,greater<int> >最后的应该是> >中间必须有一个空格,不然编译不通过。
操作函数:
Push():入队,即插入元素
Pop():出队,即删除元素
top():读取队尾元素(没有队列中的front()和back())
Empty():判断队列是否为空
Size()
:队列当前大小
自定义优先级
struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};
XDU Problem 1255 - 数列游戏
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int main()
{
//freopen("data.txt","r",stdin);
priority_queue<double,vector<double>,greater<double> > myqueue;
int cases;
cin>>cases;
while(cases--)
{
int num;
cin>>num;
for(int i=0;i<num;i++)
{
double temp;
cin>>temp;
myqueue.push(temp);
}
while(myqueue.size()>2)
{
double temp1=myqueue.top();myqueue.pop();
double temp2=myqueue.top();myqueue.pop();
myqueue.push(temp1+(temp2-temp1)/2);
}
double ans1=myqueue.top();myqueue.pop();
double ans2=myqueue.top();myqueue.pop();
printf("%.2f\n",ans1+(ans2-ans1)/2);
}
return 0;
}