安く買って高く売る(2021-TRN1-C)
(ソリューションを参照したので、提出しませんでした〜)
一般的なアイデア
ポータル
株式市場を考えると、合計n日あります。
B氏は、i日目、株価が1株当たり人民元であることを知っており、
毎日1株を買うか、売るか、何もしないかを選択できます。
当初、Bさんは無限のお金を持っていましたが、株はありませんでした。
Bさんがn日後にどれだけのお金を稼ぐことができるか尋ねてください。
(1 <= n <= 200000)
(1 <= ai <= 10000)
(注:1日で同時に売買することはできません)
トピック分析
問題解決の意味はおおまかに次のとおりです
。たとえば、1 4 10のシーケンスの場合、
最大利益は10-1でなければなりません(ただし、プログラミング時には、最大数と最小数が一目でわかりません。貪欲に見つけたらタイムアウトします)、次に優先度キューを使用して株価の最小値
1を維持します。最小値より大きいデータが読み取られると、それは総利益、popmin値に含まれます。次に、データはチームに2回プッシュされ
ます。2。それ以外の場合は、直接プッシュします。データは優先キューに入ります。
これは実行可能です。1 4 10の例では、10-1が4-1 + 10-4に分割されていると考えることができます。4が押し込まれて飛び出します。これは4を使用しないのと同じですが、これは線形になります。アルゴリズムを実現します。時間内に。
では、なぜ2回押すのでしょうか。2番目のプッシュは、数値が後で使用される最小値にならないようにすることです。
コード
#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;
///https://www.cnblogs.com/sz-wcc/p/11620480.html参考链接
int main()
{
int n;
scanf("%d",&n);
int num;
int sum=0;
while(n--)
{
scanf("%d",&num);
if(!q.empty()&&num>q.top())
{
sum+=num-q.top();
q.pop();
q.push(num);
q.push(num);
}
else
{
q.push(num);
}
}
printf("%d\n",sum);
return 0;
}