优先队列
优先队列 内部是由堆实现的。
堆的基本操作有两个 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};
};