luogu CF865D Buy Low Sell High
作者:互联网
背景:
代码贼短...
题目传送门:
https://www.luogu.org/problemnew/show/CF865D
思路:
考虑dp,设fi,j表示第i天拥有j股时的利润。
则:
[1]考虑买入:fi,j=maxk=1j−1fk,j−1−ai;
[2]考虑卖出:fi,j=maxk=1j−1fk,j−1+ai。
但这样会TLE。
因此,我们要想一种方法,观察maxk=1j−1fk,j−1这个式子,我们考虑用一个优先队列维护买入和卖出,因为我们不可能用二维存储,因此再用一个前缀和维护即可。
代码:
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
priority_queue<int,vector<int>,greater<int> > f;
int n;
LL ans=0;
int main()
{
int x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
f.push(x),f.push(x);
ans+=x-f.top();
f.pop();
}
printf("%lld",ans);
}
标签:Sell,Buy,maxk,CF865D,max,int,fi,include,1j 来源: https://blog.csdn.net/zsyz_ZZY/article/details/89328678