zoukankan      html  css  js  c++  java
  • 【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
    ",ans);
    37     return 0;
    38 }
    AC Code
  • 相关阅读:
    AES加解密
    redis HyperLogLog使用
    vi常用操作
    redis string使用
    用jdk命令定位java应用问题
    用户态、内核态及零拷贝
    缓存穿透与雪崩
    ReentrantLock、Semaphore、AQS
    redis list使用
    不同数据库取并集、交集、差集
  • 原文地址:https://www.cnblogs.com/shl-blog/p/10545823.html
Copyright © 2011-2022 走看看