优先队列priority_queue

可以看看https://blog.csdn.net/qq_34494458/article/details/53589878

优先队列默认容器时vector,默认算子时less,小的往前排,大的往后排,输出时从后往前依次输出。即大的优先级高。

  


          empty() 如果队列为空返回真
       pop() 删除对顶元素
           push() 加入一个元素
           size() 返回优先队列中拥有的元素个数
           top() 返回优先队列对顶元素
    priority_queue<int>;
    priority_queue<int,vector<int>,greater<int>>;//小的先出队。

自定义优先级:






#include <bits/stdc++.h>
#include <algorithm>
#define mod 1000000007
#define LL long long

using namespace std;

struct node{
    int x;
    friend bool operator<(node a,node b){
        return a.x < b.x;//大的优先级高。
        //return a.x > b.x //小的优先级高。
    }
};

int main()
{
    priority_queue<node>q;
    node q1;
    for(int i = 5; i >= 0; i--){
          q1.x = i;
          q.push(q1);
    }
    while(!q.empty()){
            node q2;
            q2 = q.top();
        cout << q2.x << endl;
        q.pop();
    }
    return 0;
}


 hdu看病要排队 http://acm.hdu.edu.cn/showproblem.php?pid=187

#include <bits/stdc++.h>
#include <iostream>
const int Max = 1e6+5;
#define LL long long
const int mod = 1e6+7;
//const int inx = INT_MAX; 
using namespace std;
/* run this program using the console pauser&nbs***bsp;add your own getch, system("pause")&nbs***bsp;input loop */
//	srand(time(NULL));
//		m = rand() % 1000 + 1;

//定义i i(A) i+n i+n(B) i+n+n i+n+n(C) 

struct node{
	int b,k;
	friend bool operator < (node a,node c){
		if(a.b == c.b) return a.k > c.k;//优先级相同按先来的优先级高。
		return a.b < c.b;
	}
};

int main()
{
	int N,A,B,t1,t2,t3;
	char ch[10];
	while(cin >> N){
	priority_queue<node>q1;
	priority_queue<node>q2;
	priority_queue<node>q3;
	node q;
		t1 = t2 = t3 = 0;
		while(N--){
			cin >> ch;
			if(ch[0] == 'I'){
				cin >> A >> B;
				q.b = B;
				t1++;
				q.k = t1;
				if(A == 1) {
					q1.push(q);
				}
				else if(A == 2){
					q2.push(q);
				} 
				else{
					q3.push(q);
				}
			}
			else{
				cin >> A;
				if(A == 1){
					if(!q1.empty()){
					q = q1.top();
					cout << q.k << endl;
					q1.pop();
				}
				else cout << "EMPTY" << endl;
				}
				else if(A == 2){
					if(!q2.empty()){
					q = q2.top();
					cout << q.k << endl;
					q2.pop();
				}
				else cout << "EMPTY" << endl;
				}
				else{
					if(!q3.empty()){
					q = q3.top();
					cout << q.k << endl;
					q3.pop();
				}
				else cout <<  "EMPTY" << endl;
				}
			} 
		}
	}
	return 0;
}

排队:https://ac.nowcoder.com/acm/contest/6488/C

class Solution {
public:
    /**
     * 求解合法的(i,j)对的数量
     * @param n int整型 n个人
     * @param m int整型 m个窗口
     * @param a int整型vector 长度为n的vector,顺序表示1-n号客人的办理业务所需时间
     * @return long长整型
     */
    long long t_sum[100005],t[100005];
    long long ans = 0;
    void merge(int l,int mid,int r){
        int j,m;
        m = l,j = mid+1;
        for(int i = l; i <= r; i++){
            if(m <= mid && (j > r || t_sum[m] <= t_sum[j])){
                t[i] = t_sum[m];
                m++;
            }
            else{
                t[i] = t_sum[j];
                j++;
                ans += mid - m + 1;
            }
        }
        for(int i = l; i <= r; i++){
            t_sum[i] = t[i];
        }
    }
    void sort_merge(int l,int r){
        if(r <= l) return;
        int mid = (l + r) / 2;
        sort_merge(l,mid);
        sort_merge(mid+1,r);
        merge(l,mid,r);
    }
    long long getNumValidPairs(int n, int m, vector<int>& a) {
        // write code here
        priority_queue<long long,vector<long long>,greater<long long>>q;
        int  t = min(n,m);
        for(int i = 0; i < t; i++){
            t_sum[i] = a[i];
            q.push(t_sum[i]);
        }
        long long temp;
        for(int i = m; i < n; i++){
            temp = q.top();
            t_sum[i] = temp + a[i];
            q.pop();
            q.push(t_sum[i]);
        }
        sort_merge(0,n-1);
       return ans;
}
};


全部评论

相关推荐

04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
牛客ID:561366855:期望薪资多少?难以相信这简历找不到工作。说明二本电子信息专业想对口就业非常难。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务