优先队列(priority_queue)的cmp,POJ(2051)

sort()函数的cmp为函数,priority_queue的cmp为类,具体写法是:

struct Node {
      int i,j;
} node[200];

struct cmp {
    bool operator() (Node a,Node b) {
        if(a.i==b.i)
            return a.j<b.j;///j的升序
        return a.i<b.i;    ///i的升序
        }
};

priority_queue<Node,vector<Node>,cmp> re;

#include <iostream>
#include <queue>
using namespace std;

typedef struct {
    int id;///用户ID
    int time;///下一次出该出现的时间
    int period;///时间间隔
} Register;

///定义优先权队列的比较函数
struct cmp {
    bool operator()(Register a,Register b) {
        if(a.time==b.time)
            return a.id>b.id;///时间相等时按照id升序排列
        return a.time>b.time;///按照时间升序排列,成为最小堆
    }
};

int main() {
    ///定义优先权队列,到达时间最小的最先到,相等时按照id升序排列
    priority_queue<Register,vector<Register>,cmp > re;
    string cmd;///命令
    int id;///定义id
    int period;///定义时间间隔
    int count;///定义输出条数
    while(true) {
        cin>>cmd;
        if(cmd.compare("#")==0)break;
        cin>>id>>period;
        Register r;
        r.id = id;
        r.period = period;
        r.time = period;
        re.push(r);
    }
    cin>>count;
    while(count--) {
        Register reg = re.top();
        cout<<reg.id<<endl;
        reg.time += reg.period;
        re.pop();
        re.push(reg);
    }
    return 0;
}

时间: 2024-09-29 04:09:59

优先队列(priority_queue)的cmp,POJ(2051)的相关文章

浅谈C++ STL中的优先队列(priority_queue)

从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际上,它的本质就是一个heap,我从STL中扒出了它的实现代码,大家可以参考一下. 首先函数在头文件<queue>中,归属于命名空间std,使用的时候需要注意. 队列有两种常用的声明方式: std::priority_queue<T> pq; std::priority_queue<

优先队列priority_queue的简单应用

优先队列 引入 优先队列是一种特殊以及强大的队列. 那么优先队列是什么呢? 说白了,就是一种功能强大的队列. 它的功能强大在哪里呢? 四个字:自动排序. 优先队列的头文件&&声明 头文件: #include<queue> using namespace std; 其次,一个优先队列声明的基本格式是: priority_queue<结构类型> 队列名; priority_queue<int> i; priority_queue<double>

优先队列 priority_queue 55 nyist

greater<float> 从小到大lesser<float> 总大到小 #include<queue>#include<iostream>using namespace std;int main(){ int n,m,t,x,y; long long s; priority_queue <int,vector<int>,greater<int> > my; cin>>n; while (n--) { s=0

[C/C++标准库]_[优先队列priority_queue的使用]

std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就需要优先级越高的先执行.而queue并没有排序功能,这时priority_queue是比较好的选择. 2 对于异步的task也是一样,在不断添加新的task时,当然希望优先级越高的先执行. 解析: 1. 如果需要把优先级最高的先pop,那么comp比较时需要返回false. 代码: //1.Elements are popped from the "back"

892A. Greed#贪婪(优先队列priority_queue)

题目出处:http://codeforces.com/problemset/problem/892/A 题目大意:有一些可乐(不一定装满),问能不能把所有可乐装进两个可乐瓶中 #include<iostream> #include<queue> #include<vector> using namespace std; int main(){ priority_queue< long long,vector<long long >,less<lo

poj 2051 Argus(优先队列)

题目链接: http://poj.org/problem?id=2051 思路分析: 优先级问题,使用优先队列求解:当执行某个任务后,再增加一个任务到队列中, 该任务的优先级为执行任务的时间加上其时间间隔,如此反复直到求出前K个执行任务. 代码: #include <iostream> #include <queue> using namespace std; struct Argu { int QNum; int period; int time; bool operator&l

POJ: 2413 ——优先队列——结构体cmp函数一级排序

我要翻译题目!!! /* A group of cows grabbed a truck and ventured on an  expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock and puncture the truck's fuel tank. The truck now leaks one unit of fuel ev

POJ 2051 argus(简单题,堆排序or优先队列)

又是一道数据结构题,使用堆来进行权值调整和排序,每次调整都是o(n)的复杂度,非常高效. 第一眼看题觉得可以用优先队列来做,应该也很简单. 事实上多数优先队列都是通过堆来实现的. 写的时候还是出了一些问题: 1.二叉树根节点下标显然不能为0: 2.限界之后若出现扩界要小心: 3.在迭代循环比较的时候,尤其注意到底比较的是谁,别把自己绕晕了. ac代码: #include<iostream> #include<cstdio> #include<cstdlib> #incl

poj 2051.Argus 解题报告

题目链接:http://poj.org/problem?id=2051 题目意思:题目有点难理解,所以结合这幅图来说吧---- 有一个叫Argus的系统,该系统支持一个 Register 命令,输入就是类似样例中的: Register 2004 200 代表编号为 2004 的 Register,每隔 200 个时间单位就会产生一次.2005 同理.然后需要输出前 k 个事件.如果多个事件同时发生,就先输出编号较少的.所以在 600 这个时间上,2004 要比 2005 先输出. 第一次学 rj