priority_queue(优先队列)

队列:先输入先输出

优先队列使用方法:

头文件:

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

#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;
}


 

 

 

 

 

你可能感兴趣的:(priority_queue(优先队列))