P2234 [HNOI2002] 营业额统计

题目描述

Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

Tiger 拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:当最小波动值越大时,就说明营业情况越不稳定。

而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助 Tiger 来计算这一个值。

我们定义,一天的最小波动值 = min⁡{∣该天以前某一天的营业额−该天营业额∣}

特别地,第一天的最小波动值为第一天的营业额。

输入格式

第一行为正整数 𝑛n(𝑛≤32767) ,表示该公司从成立一直到现在的天数,接下来的 𝑛 行每行有一个整数 𝑎𝑖ai​(∣𝑎𝑖∣≤106) ,表示第 𝑖 天公司的营业额,可能存在负数。

输出格式

输出一个正整数,即每一天最小波动值的和,保证结果小于 231。

代码:

90分(未AC):

java 复制代码
package lanqiao;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n + 1];
        for(int i = 1;i <= n;i ++)
        {
            a[i] = sc.nextInt();
        }

        int count = a[1];

        for(int i = 2;i <= n;i ++)
        {
            int min = Integer.MAX_VALUE;
            for(int j = i - 1;j >= 1;j --)
            {
                int tmp = Math.abs(a[j] - a[i]);
                if(tmp < min)
                {
                    min = tmp;
                }
            }
//            System.out.println(min);
            count += min;
        }

        System.out.println(count);
    }
}

引入STL优化:

java 复制代码
package lanqiao;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        TreeSet<Integer> set = new TreeSet<>();
        set.add(-10000000);
        set.add(10000000);
        long ans = 0;
        ans += sc.nextInt();
        set.add((int)ans);

        for(int i = 1;i < n;i ++)
        {
            int now = sc.nextInt();
            int higher = set.higher(now);
            if(higher != now)
            {
                int lower = set.lower(higher);
                ans += Math.min(Math.abs(higher-now),Math.abs(lower-now));
                set.add(now);
            }
        }

        System.out.println(ans);
    }
}
相关推荐
wuminyu20 分钟前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
草莓橙子碗30 分钟前
Claude 使用指南
开发语言·python
SWAGGY..32 分钟前
【C++进阶】:(1)继承机制详解
java·jvm·c++
longxiaozhang61 小时前
C# Array类:数组其实没那么难
开发语言·c#
北风toto1 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)1 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码匠许师傅1 小时前
【C++ 面试真题】27. 聊聊 C++ 的内存泄漏与内存布局
java·c++·面试
码流怪侠2 小时前
2026年8月GitHub热榜深度拆解:Agent Skills席卷开源圈,一个“技能包“收割5万星
算法·程序员·github
hold?fish:palm2 小时前
30 两两交换链表中的节点
数据结构·算法·链表
互联网中的一颗神经元2 小时前
06. Small 对象分配:mcache 无锁路径
开发语言·golang