【HNOI2002】营业额统计

这道题用平衡树能过,但是代码量较大,不易编写和调试,所以我们考虑别的方法解决。

考虑当前为第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\n",ans);
37     return 0;
38 }
AC Code

 

posted @ 2019-03-17 10:31  AD_shl  阅读(202)  评论(0编辑  收藏  举报