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() 返回优先队列对顶元素
例题:
优先队列使用方法:
头文件:
*******************
#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; }
相关文章推荐
- iOS开发UI篇—Quartz2D使用(绘制基本图形)
- hdu5312 Sequence 三角形数的应用
- 1062. Talent and Virtue (25)
- 1062. Talent and Virtue (25)
- IOS中UITextField限制字数,特别是中文
- ios开发--UISegmentedControl分段
- hdu 5301 Buildings
- 游戏UI库
- Implement Queue using Stacks
- ios开发--UIGestureRecognizer
- iOS-UI-05 导航控制器的使用 UINavigationController
- iOS-UI-滚动视图2—分页查看功能
- 写在Demo战斗系统之前,先用原型工具做套UI第二篇-人物选择界面制作
- IOS GCD queue group
- 无法使用以下搜索标准找到 X.509 证书: StoreName“My”、StoreLocation“LocalMachine”、FindType“FindBySubjectName”、FindValue“MyWebSite”。
- easyui 获取指定列的值,格式化该列的值的实例
- iOS中添加UITapGestureRecognizer手势识别后,UITableView的didSelectRowAtIndexPath失效
- VisualSVN错误 Cannot query proxy blanket解决办法
- UISegmentControl 和UIslider
- QQuickImageProvider在QML设计中的应用