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);
    }
}
相关推荐
phltxy几秒前
C语言操作符详解
java·c语言·算法
aqiu11111136 分钟前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp
步行cgn1 小时前
@Configuration 详解:Spring 配置类的核心注解
java·后端·spring
sunshine22 girl1 小时前
Java学习一 环境配置2 安装和基本使用Idea
java·学习·intellij-idea
辰烨chenye1 小时前
LeetCode Hot 100 题解 · 哈希篇
算法·leetcode·哈希算法
事圆则缓2 小时前
Kotlin 协程完全指南
开发语言·kotlin
罗西的思考2 小时前
DreamZero 与 DreamDojo:世界模型与策略的分层协同综合分析与对比
人工智能·算法·机器学习
我爱写代码i2 小时前
BeLink - 支持生成多种URL 缩短网址PHP源码
开发语言·php·短网址php源码
Java后端的Ai之路2 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式