您的位置:首页 > 产品设计 > UI/UE

priority_queue(优先队列)

2015-07-29 14:37 375 查看
队列:先输入先输出

优先队列使用方法:

头文件:

*******************

#include<queue>

using namespace std;

***********************

声明方法:

1.普通方法:priority_queue<int>q;//下划线不可漏,默认从大到小输出队

2.结构体声明方式:

struct node

{

int x,y;

frinend bool operator < (node a,node b)// < ,此符号固定,若想要改变输出顺序,可改函数内部符号与内容

{

return a.x>b.x;//按x的大小,从小到大输出队

}

}vt;

priority_queue<node>q;

自定义优先级:

priority_queue<int,vector<int>,greater<int> >q;//vector为容器,按从小到大顺序输出队

priority_queue<int,vector<int>,less<int> >q;//按从大到小顺序输出队

基本操作:
push(x) 将x压入队列的末端
empty() 如果队列为空返回真
pop() 删除对顶元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素

例题:

/*hdu--1509*/
#include<cstdio>
#include<queue>
#include<string.h>
using namespace std;
struct node
{
char name[10];
int x;
int y;
int z; //用于控制优先级相同时的输出顺序
}vt;
bool operator < (node a,node b)
{
if(a.y==b.y)
{
return a.z>b.z;
}
return a.y>b.y;

}
priority_queue<node>q;//定义一个按结构体中y的大小从小到大输出
int main()
{

char t[5],b[10];
int c1,c2,k;
k=1;
while(scanf("%s",t)!=EOF)
{
if(strcmp(t,"PUT")==0)
{
scanf("%s%d%d",vt.name,&vt.x,&vt.y);
{
vt.z=k;
q.push(vt);

}
}
else if(strcmp(t,"GET")==0)
{
if(!q.empty())
{
strcpy(b,q.top().name);
printf("%s ",b);
//printf(" ");
c1=q.top().x;
printf("%d\n",c1);
q.pop();
}
else printf("EMPTY QUEUE!\n");
}
k++;
}
return 0;
}


/*hdu--1896(stones)--优先队列*/
#include<stdio.h>
#include<queue>
using namespace std;
struct stu
{
int x,y;
friend	bool operator<(stu a,stu b)
{
if(a.x==b.x)return a.y>b.y;//从小到大排序
return a.x>b.x;
}
}zt,vt;
priority_queue<stu>q;
int main()
{
int n,m,i,j,k,x1,star,sum;
scanf("%d",&n);
while(n--)
{
k=1;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&vt.x,&vt.y);
q.push(vt);
}
sum=q.top().x;
while(!q.empty())
{
if(k%2==0)
q.pop();
else
{
zt.x=q.top().x;
zt.y=q.top().y;
zt.x+=zt.y;
q.pop();
if(zt.x>sum)
sum=zt.x;
q.push(zt);
}
k++;
}
printf("%d\n",sum);
}
return 0;
}// the start point 是 Sempr一开始出发的点


/*nyoj--757
分析:
你首先要对日期进行排序,要是没有重复的日期就好了,一天一个,这肯定挂不了科啊!。有也没事,先按日期从小到大,有重复日期的,按分值的从小到大排序。
排好后,我们本着一天一个的原则,当遇到重复日期的时候就要有所取舍了,那肯定是不要分值少的啊,所以就和前面最小的比较,看哪个更小,就不复习了分数不要了!
不要的分数加起来就是最小的了!这个题就是要利用优先队列了!因为它能自动排序,省下不少事!*/
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
struct stu
{
int d,s;

}vt[2003];
int cmp(stu a,stu b)
{
if(a.d==b.d)return a.s>b.s;
return a.d<b.d;
}
int main()
{
int n,i,m,sum,x;
priority_queue<int,vector<int>,greater<int> >q;
while(scanf("%d",&n)!=EOF)
{
while(!q.empty())
{
q.pop();
}
for(i=0;i<n;i++)
scanf("%d %d",&vt[i].d,&vt[i].s);
sort(vt,vt+n,cmp);
//for(i=0;i<n;i++)
//m=vt[n-1].d;sum=0;
//printf("%d\n",m);
//m=vt[n-1].d;sum=0;
m=vt[n-1].d;sum=0;
for(i=0;i<n;i++)
{
if(q.size()<vt[i].d)
{
q.push(vt[i].s);
}
else
{
x=q.top();
if(vt[i].s>x)
{
sum+=x;
q.pop();
q.push(vt[i].s);
}
else sum+=vt[i].s;
}
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: