安く買って高く売る(2021-TRN1-C)

安く買って高く売る(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;
}

おすすめ

転載: blog.csdn.net/booniebears/article/details/112971807