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

[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;
}

相关内容

热门资讯

“小爱同学”不是想喊就能喊 (来源:法治日报)转自:法治日报□ 本报记者   罗莎莎  □ 本报通讯员 刘晓慧 张海陵  科技飞...
以文塑城 以旅兴城 (来源:衢州日报)转自:衢州日报  记者 赵凯怡  当人文温度融入城市治理的肌理,衢州将千年文脉转化...
中煤(宣威)新能源有限公司成立... 经济观察网 天眼查App显示,12月3日,中煤(宣威)新能源有限公司成立,法定代表人为杨航行,注册资...
深化普法长效机制,打造法治宣传... (来源:法治日报)转自:法治日报□ 周元卿  法治宣传教育是全面依法治国的长期基础性工作。党的二十届...
《雨中曲》等经典剧目岁末年初蓉... 转自:成都日报锦观《雨中曲》等经典剧目岁末年初蓉城上演 本报讯 (成都日报锦观新闻记者 余力)...