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

相关内容

热门资讯

商务部:2026年重点做好提振... 转自:证券日报    本报记者 刘萌    据商务部消息,全国商务工作会议1月10日至11日在京召开...
兵团大数据招商一年引来超百亿元... 本报乌鲁木齐讯(全媒体记者 张美玲) “兵团招商人员通过大数据电子招商平台,为我们精准匹配了五师...
“个人医保云”试点申报启动将提... 转自:证券日报    新华社北京1月11日电(记者 彭韵佳)国家医保局1月11日发布文件,开展“个人...
“个人医保云”试点申报启动 新华社北京1月11日电(记者 彭韵佳) 国家医保局1月11日发布文件,开展“个人医保云”建设试点...
专业引领、街区共治,社区规划师... 近年来,上海全力推进旧区改造和社区更新,推进过程中往往面临多元利益诉求交织的复杂局面,如何广泛协商,...