这道题用平衡树能过,但是代码量较大,不易编写和调试,所以我们考虑别的方法解决。
考虑当前为第i天,我们把前i-1天的营业额放入一个容器当中并排序,对于第i天的营业额x,若容器中没有元素,则表示这是第一天。
另外,我们用lower_bound()函数求出大于等于x的最小值x'是多少,若x==x',则这一天的最小波动值为0,否则,我们将以下两个数的绝对值比较,
取最小值:x-x',x-x'' (x'表示大于x的最小的数,x''表示小于x的最大的数)
此时,我们想到的STL中的set。set会将插入的元素去重并排序,完全符合题意,所以代码也很简单。
1 #include <cstdio> 2 #include <iostream> 3 #include <set> 4 #include <algorithm> 5 #include <cmath> 6 typedef long long ll; 7 inline int read() { 8 int ret=0,f=1; 9 char c=getchar(); 10 while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} 11 while(c<='9'&&c>='0') ret=ret*10+c-'0',c=getchar(); 12 return ret*f; 13 } 14 using namespace std; 15 int n,ans; 16 set<int> s; 17 set<int>::iterator k,a; 18 int main() { 19 n=read(); 20 s.insert(2147483646); 21 s.insert(-2147483646); 22 for(int i=1,x;i<=n;i++) { 23 x=read(); 24 if(s.size()==2) { 25 ans+=x; 26 s.insert(x); 27 continue ; 28 } 29 k=s.lower_bound(x); 30 if(*k==x) continue ; 31 a=k; 32 a--; 33 ans+=min(abs(*k-x),abs(*a-x)); 34 s.insert(x); 35 } 36 printf("%d ",ans); 37 return 0; 38 }