news 2026/1/7 15:29:45

csp信奥赛C++标准模板库STL案例应用7

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
csp信奥赛C++标准模板库STL案例应用7

csp信奥赛C++标准模板库STL案例应用7

set实践

题目描述

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

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

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

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

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

输入格式

第一行为正整数n nnn ≤ 32767 n \leq 32767n32767) ,表示该公司从成立一直到现在的天数,接下来的n nn行每行有一个整数a i a_iai∣ a i ∣ ≤ 1 0 6 |a_i| \leq 10^6ai106) ,表示第i ii天公司的营业额,可能存在负数。

输出格式

输出一个整数,即每一天最小波动值的和,保证结果小于2 31 2^{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 = 12 5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=125+∣15∣+∣21∣+∣55∣+∣45∣+∣65∣=5+4+1+0+1+1=12

思路分析

本题要求计算每天营业额的最小波动值之和。对于第 i 天的营业额,需要在之前的所有营业额中找到与它最接近的值(前驱或后继),计算差的绝对值。

核心思想
  1. 使用平衡二叉搜索树(这里用 C++ 的set)来维护之前的所有营业额
  2. 对于每个新的营业额:
    • lower_bound找到第一个大于等于当前值的位置
    • 这个位置和它前一个位置(如果存在)就是与当前值最接近的两个候选值
    • 取这两个值与当前值差的最小值作为当天的最小波动值
  3. 第一天特殊处理,最小波动值就是当天的营业额
时间复杂度
  • 使用set每次插入和查询都是 O(log n)
  • 总时间复杂度:O(n log n),n ≤ 32767,可以接受

代码实现

#include<bits/stdc++.h>usingnamespacestd;intn,sum=0;// n: 天数,sum: 最小波动值总和set<int>s;// 用set存储之前的营业额,自动排序intmain(){cin>>n;for(inti=1;i<=n;i++){intx;cin>>x;// 读取当天的营业额// 如果是第一天,特殊处理if(s.empty()){sum+=x;// 第一天最小波动值就是营业额本身s.insert(x);// 加入集合continue;}// 使用lower_bound找到第一个大于等于x的位置autoit=s.lower_bound(x);intans=INT_MAX;// 初始化最小差值为最大整数// 检查后继(如果存在)if(it!=s.end()){ans=min(ans,abs(*it-x));}// 检查前驱(如果存在)if(it!=s.begin()){it--;// 移动到前一个位置ans=min(ans,abs(*it-x));}// 累加当天的最小波动值sum+=ans;// 将当天营业额加入集合,供后续使用s.insert(x);}cout<<sum;return0;}

功能分析

1. 数据结构选择
  • 使用set<int>:自动排序,可以快速查找前驱和后继
  • 基于红黑树实现,插入和查找都是 O(log n) 时间复杂度
2. 算法流程
  1. 初始化:读取天数 n,初始化总和 sum 和集合 s
  2. 处理每一天
    • 读取当天营业额 x
    • 如果集合为空(第一天),直接累加 x
    • 否则,查找 x 在集合中的插入位置:
      • 查找第一个 ≥ x 的数(后继)
      • 查找第一个 < x 的数(前驱)
      • 取两者与 x 差的最小值
    • 累加到总和
    • 将 x 插入集合
  3. 输出结果:输出总和 sum
3. 关键点
  • lower_bound(x)返回第一个 ≥ x 的迭代器
  • 如果lower_bound返回end(),说明没有 ≥ x 的数
  • 前驱检查:it != s.begin()确保有前一个元素
  • 第一天特殊处理:最小波动值 = 当天营业额
4. 示例解析

输入:

6 5 1 2 5 4 6

处理过程:

  • 第1天:sum=5,集合={5}
  • 第2天:x=1,前驱/后继:5,差值=4,sum=9,集合={1,5}
  • 第3天:x=2,前驱=1(差1),后继=5(差3),取1,sum=10,集合={1,2,5}
  • 第4天:x=5,找到相等的5,差=0,sum=10,集合={1,2,5}
  • 第5天:x=4,前驱=2(差2),后继=5(差1),取1,sum=11,集合={1,2,4,5}
  • 第6天:x=6,前驱=5(差1),无后继,取1,sum=12,集合={1,2,4,5,6}

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}
  • 一、CSP信奥赛C++通关学习视频课:
    • C++语法基础
    • C++语法进阶
    • C++算法
    • C++数据结构
    • CSP信奥赛数学
    • CSP信奥赛STL
  • 二、CSP信奥赛C++竞赛拿奖视频课:
    • 信奥赛csp-j初赛高频考点解析
    • CSP信奥赛C++复赛集训课(12大高频考点专题集训)
  • 三、考级、竞赛刷题题单及题解:
    • GESP C++考级真题题解
    • CSP信奥赛C++初赛及复赛高频考点真题解析
    • CSP信奥赛C++一等奖通关刷题题单及题解

详细内容:

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转


2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

3、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

  • 2025 csp-j 复赛真题及答案解析(最新更新)
  • 2025 csp-x(山东) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(河南) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(辽宁) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(江西) 复赛真题及答案解析(最新更新)
  • 2025 csp-x(广西) 复赛真题及答案解析(最新更新)
  • 2020 ~ 2024 csp 复赛真题题单及题解
  • 2019 ~ 2022 csp-j 初赛高频考点真题分类解析
  • 2021 ~ 2024 csp-s 初赛高频考点解析
  • 2023 ~ 2024 csp-x (山东)初赛真题及答案解析
  • 2024 csp-j 初赛真题及答案解析
  • 2025 csp-j 初赛真题及答案解析(最新更新)
  • 2025 csp-s 初赛真题及答案解析(最新更新)
  • 2025 csp-x (山东)初赛真题及答案解析(最新更新)
  • 2025 csp-x (江西)初赛真题及答案解析(最新更新)
  • 2025 csp-x (辽宁)初赛真题及答案解析(最新更新)

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

  • 129 道刷题练习和详细题解,涉及:模拟算法、数学思维、二分算法、 前缀和、差分、深搜、广搜、DP专题、 树和图

4、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 8:38:17

8、远程医疗:挑战、益处与 Office 365 的应用

远程医疗:挑战、益处与 Office 365 的应用 远程医疗流程与优势 远程医疗旨在为患者提供无论地理位置如何都能获得相同或更高质量的持续医疗服务。患者致电医疗服务提供商的呼叫中心预约医生,分诊护士会询问相关问题,以确定患者是否适合进行远程问诊。根据患者情况,分诊护…

作者头像 李华
网站建设 2025/12/27 4:22:27

为什么说ASMR下载工具是资源管理的最佳解决方案?

为什么说ASMR下载工具是资源管理的最佳解决方案&#xff1f; 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader asmr-downloader是一款专为ASMR爱…

作者头像 李华
网站建设 2025/12/27 4:22:25

ASMR音频资源一键获取指南:高效下载asmr.one海量内容

ASMR音频资源一键获取指南&#xff1a;高效下载asmr.one海量内容 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 在当今高压生活环境下&#…

作者头像 李华
网站建设 2025/12/27 4:22:23

Sollumz插件完整指南:在Blender中快速创建GTA V游戏资源

Sollumz插件完整指南&#xff1a;在Blender中快速创建GTA V游戏资源 【免费下载链接】Sollumz Blender plugin to import codewalker converter xml files from GTA V 项目地址: https://gitcode.com/gh_mirrors/so/Sollumz 还在为GTA V游戏资源制作而烦恼吗&#xff1f…

作者头像 李华
网站建设 2025/12/27 4:22:21

Waifu-Diffusion终极解析:从零构建动漫图像生成流水线

Waifu-Diffusion终极解析&#xff1a;从零构建动漫图像生成流水线 【免费下载链接】waifu-diffusion 项目地址: https://ai.gitcode.com/hf_mirrors/hakurei/waifu-diffusion 还在为动漫角色设计耗费大量时间&#xff1f;传统AI模型生成的二次元角色总是缺少灵魂&#…

作者头像 李华
网站建设 2025/12/24 8:37:20

Boss-Key窗口隐藏神器:3秒极速切换工作状态的专业方案

Boss-Key窗口隐藏神器&#xff1a;3秒极速切换工作状态的专业方案 【免费下载链接】Boss-Key 老板来了&#xff1f;快用Boss-Key老板键一键隐藏静音当前窗口&#xff01;上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在快节奏的办公环境中&a…

作者头像 李华