队列:先输入先输出
优先队列使用方法:
头文件:
*******************
#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;//按从大到小顺序输出队
例题:
/*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; }