题目:股票
题目描述
时间限制: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 1≤n≤3∗105,1≤pi≤106
题解及代码
题解
- 输入各项数据
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;
代码
#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 表达式;
}
总结
这次我主要讲了以下内容:
- 题目:股票
- priority_queue(优先队列)
- 重载运算符