其他分享
首页 > 其他分享> > luogu CF865D Buy Low Sell High

luogu CF865D Buy Low Sell High

作者:互联网

背景:

代码贼短.........

题目传送门:

https://www.luogu.org/problemnew/show/CF865D

思路:

考虑dpdpdp,设fi,jf_{i,j}fi,j​表示第iii天拥有jjj股时的利润。
则:
[1][1][1]考虑买入:fi,j=maxk=1j1fk,j1aif_{i,j}=\max_{k=1}^{j-1}f_{k,j-1}-a_ifi,j​=maxk=1j−1​fk,j−1​−ai​;
[2][2][2]考虑卖出:fi,j=maxk=1j1fk,j1+aif_{i,j}=\max_{k=1}^{j-1}f_{k,j-1}+a_ifi,j​=maxk=1j−1​fk,j−1​+ai​。
但这样会TLETLETLE。

因此,我们要想一种方法,观察maxk=1j1fk,j1\max_{k=1}^{j-1}f_{k,j-1}maxk=1j−1​fk,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