优先队列 与 重载运算符

优先队列

优先队列 内部是由堆实现的。

堆的基本操作有两个 up 和 down。

up是插入元素时进行对堆维护的操作。

down是取出元素时进行对堆维护的操作。

具体有关于堆的可以看一看这一篇博客 堆 

基本操作

priority_queue<int> q; // 大根堆的定义
priority_queue<int, vector<int>, greater<int> > q; // 小根堆的定义
priority_queue<int, vector<int>, less<int> > q; // 大根堆的定义
q.push(x)将x入队列 
q.top()取队首元素的值
q.pop()队首元素出队
q.empty()队列空返回true,否则返回false 
q.size()返回q内元素个数 
q.clear();清空队列 

例题

题目简要

给定一些数字,求序列数字中每次取两个相加,每次统计值的最小值。

输入描述

        输入包括两行,第一行是一个整数n(1< =n< =10000),表示数量。第二行包含n个整数,用空格分隔,第i个整数ai(1< =ai< =20000)是ai的数值。 

输出描述

        输出包括一行,这一行只包含一个整数,也就是最小值。输入数据保证这个值小于2^31。 

样例

输入
3 
1 2 9 
输出
15 

解析

本体明显为一个贪心问题,可以使用优先队列维护最小值,每次取出两个数计算、记录值、再次放入队列中,最后可求得答案。

题解

#include <cstdio>
#include <string>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <set>
#include <list>
using namespace std;

#define bug printf("--------\n");
#define debug(x) cout << #x << '=' << x << endl;
#define file(FILENAME) freopen(FILENAME ".in", "r", stdin), freopen(FILENAME ".out", "w", stdout);
#define rep(i, a, b) for(int (i) = (a); (i) <= (b); ++(i))
#define inv(x) qpow((x), mod - 2)
#define pb push_back
#define mk make_pair
#define mem(t, v) memset((t), (v), sizeof (t));
#define DBG cerr << __LINE__  << ' ' << __FUNCTION__ << endl;
#define CLOSE ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define N 10005
#define M 10005
#define inf 0x3f3f3f3f
#define mod 10007

typedef long long ll;
typedef unsigned long long ull;
ll gcd(ll a, ll b) { while (a ^= b ^= a ^= b %= a); return b; }
ll ppow(ll x, ll y) { ll sum = 1; while (y) { if (y & 1) sum *= x; y >>= 1, x *= x; } return sum; }
bool prime(ll x) { for (int i = 2; i * i <= x; i++) { if (x % i == 0) return false; } return true; }

// ll a[N], b[N];
// bool vis[N];
// stack<ll> st;
// queue<ll> q;
// map<ll,ll> mp;
// vector<ll> v;
// char c;
// string s;
// struct node {
//     ll x;
//     ll y;
// }d[N];
ll n, m, l, k, p, i;
ll ans, cnt, sum, num;
priority_queue<ll, vector<ll>, greater<ll> > q;

int main() {
    // file("")
    CLOSE
    cin>>n;
    rep(i,1,n){cin>>k;q.push(k);}
    rep(i,1,n-1){sum=q.top(),q.pop();sum+=q.top(),q.pop();ans+=sum;q.push(sum);}
    cout<<ans;
    return 0;
}

重载运算符

对于一些STL中,对结构体非常的不友好,其原因时结构体无法排序,但是重载运算符后就可以正常排序了。

使用方法

// 第一种重载运算符
struct node{
    int num,sum;
    friend bool operator<(node a,node b){
        return a.sum>b.sum;
    }
};

// 第二种重载运算符
struct node{
    int num,sum;
    bool operator<(const node a) const{ // 此处第二个const在STL的使用中必须加上
        return sum>a.sum;
    }
};

// 高级的赋值方式
struct node{
    int num,sum;
    node(int a,int b){num=a,sum=b};
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值