priority_queue和重载运算符

题目:股票

题目描述

时间限制:1秒 内存限制:128M

也就是说,每天你要么买一股,要么卖一股,要么什么都不做。一开始你拥有零股票,当你没有股票的时候你不能出售股票。在N天结束时,你想再次拥有零股票,但想尽可能拥有更多的钱。

输入样例1

9
10 5 4 7 9 12 6 2 10

输出样例1

20

输入样例2

4
1 4 8 9

输出样例2

12

数据描述

1 ≤ n ≤ 3 ∗ 1 0 5 , 1 ≤ p i ≤ 1 0 6 1≤n≤3∗10^5,1≤pi≤10^6 1n3105,1pi106

题解及代码

题解

  1. 输入各项数据
cin>>n;
for(int i=1;i<=n;i++){
	int x;
	cin>>x;
}
  1. 零股票或现在卖股票会亏时,就假设要买下股票(因为要给程序反悔的机会,这样才能求出最优结果);否则就卖出股票,收益加上利润,但为了给程序反悔的机会,要假设再买进这股股票,但为了反悔不影响当天买入还要假设要买下股票
if(!p.empty() && x>p.top()){
	ans+=x-p. top();
	p.pop();
	p.push(x);
}
p.push(x);
  1. 输出
cout<<ans;

代码

#include<iostream>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> >p;
int main(){
	long long n, ans=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		if(!p.empty() && x>p.top()){
			ans+=x-p. top();
			p.pop();
			p.push(x);
		}
		p.push(x);
	}
	cout<<ans;
	return 0;
}

知识点

priority_queue(优先队列)

(其实就是个堆)
头文件:#include< queue >
特性:有序,插入删除操作时间复杂度O(log n),默认大根堆(就是最大元素在堆顶)
定义:priority_queue<类型> q;
小根堆:priority_queue<类型, vector< int >, greater< int > > q;
函数:
q.top() 访问堆顶(队首)元素
q.push() 入堆(队)
q.pop() 堆顶(队首)元素出队
q.size() 队列元素个数
q.empty() 判断是否为空
用法:经常在贪心问题中使用

重载运算符

就是重新定义一种运算符,让结构体能够使用
不能被重载的运算符:
1. 成员访问 .
2. 域运算 ::
3. 内存长度运算 sizeof
4. 三目运算 ? :
5. 预处理 #
一般形式:

friend 返回类型 operator要重载的运算符(结构体名 a,结构体名 b){
	return 表达式;
}

总结

这次我主要讲了以下内容:

  1. 题目:股票
  2. priority_queue(优先队列)
  3. 重载运算符
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值