P2234 [HNOI2002]营业额统计——set
创始人
2024-03-28 23:44:05
0

[HNOI2002]营业额统计

题目描述

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

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

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

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

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

输入格式

第一行为正整数 nnn(n≤32767n \leq 32767n≤32767) ,表示该公司从成立一直到现在的天数,接下来的 nnn 行每行有一个整数 aia_iai​(∣ai∣≤106|a_i| \leq 10^6∣ai​∣≤106) ,表示第 iii 天公司的营业额,可能存在负数。

输出格式

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

样例 #1

样例输入 #1

6
5
1
2
5
4
6

样例输出 #1

12

提示

结果说明:5+∣1−5∣+∣2−1∣+∣5−5∣+∣4−5∣+∣6−5∣=5+4+1+0+1+1=125+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=125+∣1−5∣+∣2−1∣+∣5−5∣+∣4−5∣+∣6−5∣=5+4+1+0+1+1=12

分析

  1. 除了第一天,其他天的最小波动值是 他之前的所有天其中一天与其今日营业额的差值取最小值,就是今天的最小波动值;所以需要想到排序今天之前的所有天,我们可以借助于set,来自动帮我们排序;
  2. lower_bound函数,去找到第一个>=x的位置(返回值是迭代器);然后会出现两种情况,要么==x,那就不用做任何处理;要么>x,所以我们取x与他两边的差值的最小值即可;
  3. 需要注意对set做个边界处理,比如 set已有的内容为:1 3 4 5,现在正处理某一天的营业额x,x=15,那么就在set找不到大于等于15的数,就会出错;同理当t指的是set的第一个数,迭代器t–,可能会越界; s.insert(1e7); s.insert(-1e7);
#includeusing namespace std;int n, x, ans;
set s;int main() {cin >> n;//做个边界处理s.insert(1e7);s.insert(-1e7);//第一月特处cin >> ans;s.insert(ans);for (int i = 1; i < n; ++i) {cin >> x;set::iterator t = s.lower_bound(x);//第一个>=x的位置if (*t == x) {//可以省去,但是这是下面为啥写else的原因//ans+=0//s.insert(x); 加了也会自动去重} else {int t1 = *t;t--;int t2 = *t;ans += min(abs(t1 - x), abs(t2 - x));s.insert(x);}}cout << ans;return 0;
}

相关内容

热门资讯

css样式穿透(/deep/和... css样式穿透(/deep/深度选择器)场景复现样式穿透stylus的样...
网络技术展开型介绍(超详细) ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,疫情之下&#x...
Git__本地分支与远程分支的... 文章目录前言1. 用git checkout命令关联2.用 git push命令关联3.用 git ...
LocalDateTime 的... 与 Date 相比 LocalDateTime 线程安全,因为所有字段都用了 fina...
C++ Primer笔记——l... 目录 一.lambda介绍 (一).总体介绍 (二...
Mac上安装和测试Kafka 1. 安装 默认会把zookeeper一起安装好 brew install kafka 安装日志&#...
@计算矩阵的特征值与特征向量 @计算矩阵的特征值与特征向量 文章目录 我们经常遇到一个问题就是如何计算一个矩阵的特征值和特征向...
Shell脚本编写 1 入门 1.1 脚本格式 脚本以#!/bin/bash开头(指定bash解析器&#x...
C/C++KTV点歌系统 C/C++KTV点歌系统 KTV点歌系统(版本1) 1 ...
重学c/c++之预处理 预定义符号 这些定义符号都是语言内置的 printf("%s\n",__FILE__);//绝对路...