HZOJ trade

强烈谴责$skyh$的没$Huge 脸$行为。

很经典的可反悔贪心,然而我一直以为是sbdp还一直想着怎么优化……

正常的贪心肯定是不对的。

但是由于A-C=A-B+B-C,

所以用一个小根堆维护,每次将当前天的a加入,表示当前天可以买入,

如果堆顶小于a,取出堆顶,ans加上差,再次将当天的a加入,那么如果之后卖出更优则会减掉当前的a利用差价满足了贪心性质。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 #define int LL
 6 #define LL long long
 7 using namespace std;
 8 int n,a[100010];
 9 
10 inline int read();
11 signed main()//dp xds//优化dp//单调
12 {
13 //    freopen("trade14.in","r",stdin);
14 
15     n=read();for(int i=1;i<=n;i++)a[i]=read();
16     
17     priority_queue<int,vector<int>,greater<int> >A;
18     LL ans=0;A.push(a[1]);
19     for(int i=2;i<=n;i++)
20     {
21         if(A.top()<a[i])
22         {
23             ans+=a[i]-A.top();A.pop();
24             A.push(a[i]);
25         }
26         A.push(a[i]);
27     }
28     printf("%lld
",ans);
29 }
30 inline int read()
31 {
32     int s=0,f=1;char a=getchar();
33     while(a<'0'||a>'9'){if(a=='-')f=-1;a=getchar();}
34     while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
35     return s*f;
36 }
View Code
原文地址:https://www.cnblogs.com/Al-Ca/p/11636250.html