[HNOI2002] 营业额统计 STL - set集合

文章目录

  • [HNOI2002] 营业额统计
    • 题目描述
      • 样例输入 #1
      • 样例输出 #1
    • 提示
    • 题解
    • 相关知识点
        • set

[HNOI2002] 营业额统计

STL - set解题

题目描述

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

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

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

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

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

样例输入 #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=12 5+∣15∣+∣21∣+∣55∣+∣45∣+∣65∣=5+4+1+0+1+1=12

题解

题意

统计最小的差值和,要每天的波动的差值最小,即 min = 最相近的一个数-当前值 例如 1 2 3 5 8 中 第三天的最小值min = abs(2-3) = 1

数据约束

数据在Int范围内

思路

  1. 由分析看得出,需要排序所有的数,然后取相近的-左右两边的数分别求差值 再求最小值
  2. 如果按照常规的数据处理,数组排序,然后在前后遍历显然很麻烦,只是处理找数据,所以考虑容器。set map都能自动排序,显然选set
  3. 从样例可以看得出来,数据不能做去重处理,所以直接使用mutiset即可

参考代码

#include <bits/stdc++.h>
using namespace std;
multiset<int> s;//数据存放在一个集合中 
int main() {int n,ans=0;int minn=1e10,maxx=1e10,k;cin>>n;for(int i=0;i<n;i++){minn=1e10,maxx=1e10;//每次都初始化一下 cin>>k;s.insert(k);
//		multiset<int> ::iterator it;
//		for(it=s.begin();it!=s.end();it++){
//			cout<<*it<<" ";
//		}
//		cout<<endl;if(i==0){ans += k;}else{multiset<int> ::iterator ad;ad = s.find(k);ad++;
//			if((ad++)!=s.end()){ //不是最后一个if(ad!=s.end()){ //不是最后一个maxx  = abs(*ad - k);ad--;}else{ad--;}//处理前一个if(ad!=s.begin()){ad--;minn  = abs(*ad - k) ;}ans += min(maxx,minn);}}cout<<ans;}

相关知识点

set

特点

  • 无重复元素:不允许存储重复的元素。
  • 有序存储:元素按某种规则(通常是升序)自动排序。
  • 查找高效:可以高效查找某个元素是否存在。

例子
想象你在一副扑克牌中找一张牌,牌面上没有重复的牌。如果你想找某张牌,只需按顺序查找,而不需要检查重复。每张牌都按照花色和点数排序,保证没有重复并且顺序明确。。

set 是关联容器的一种,是排序好的集合(自动排序) ,不能有重复的元素。

  • 不能直接修改set容器中元素的值。因为元素被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破 坏,再在其上进行查找等操作就会得到错误的结果。若要修改set 容器中某个元素的值,则先删除该元素,再插入新元素。
  • multiset容器类似set容器 ,但它能保存重复的元素。(mult开头有多个的意思 mutimedia多媒体,muticultural多元文化)
  • set支持双向迭代器,在插入和删除时,所以不能直接采用迭代器++/–的方式。 v在STL中使用结构体 ,需要对特定要求的运算符进行重载;
  • STL默认使用小于号来排序,因此,默认重载小于号: (如 果使用greater比较器就需重载大于号),且要注意让比较函数对相同元素返回false.
函数名set 用法map 用法说明
insert 插入元素,返回迭代器mySet.insert(value),插入**键值对 ** myMap.insert({key, value}) 或myMap.insert(make_pair(key, value));如果键已存在,则不会插入新键值对,直接返回已存在的迭代器
size返回容器中元素的个数同set
find查找元素,返回迭代器mySet.find(value)同set myMap.find(key)若未找到则返回 end()迭代器
operator[] -(不适用)访问/修改指定键对应的值(若键不存在则插入默认构造的值
count返回等于给定值的元素个数 mySet.count(value);返回键等于给定关键字的键值对个数 myMap.count(key)只能是 0 或 1)

通用的成员函数:

end 返回指向容器中最后一个元素之后位置的迭代器 返回指向容器中最后一个键值对之后位置的迭代器

begin 返回指向容器中第一个元素的迭代器 同set

clear 清空容器,删除所有元素 清空容器,删除所有键值对

erase 删除元素,可通过迭代器或值删除 删除键值对,可通过迭代器或键删除 mySet.erase(it);mySet.erase(value);

	set<int> mySet;mySet.insert(5);// 插入元素mySet.insert(2);mySet.insert(8);mySet.insert(1);// 查找元素(返回迭代器)set<int>::iterator it=mySet.find(1);if (it!=mySet.end()) {cout<<"Found: "<<*it<<endl;}mySet.erase(it);// 删除元素cout<<"Size1: "<<mySet.size() <<endl; 	// 获取元素个数mySet.erase(5); // 使用值删除mySet.clear();// 清空容器cout<<"Size2: "<<mySet.size() <<endl;	// 获取元素个数
------------------------------set<string> partyGuests; // 定义一个 set,模拟聚会的宾客名单partyGuests.insert("Alice");    // 添加一些宾客partyGuests.insert("Bob");partyGuests.insert("Charlie");partyGuests.insert("Alice");  // Alice 已经在名单上了,不会重复添加// 输出所有的宾客,按照字母顺序排列for (set<string>::iterator it = partyGuests.begin(); it != partyGuests.end(); it++) {cout << *it << " ";}cout << endl;  // 输出:Alice Bob Charlieset<string>::iterator search_it = partyGuests.find("Charlie"); // 查找某个宾客if (search_it != partyGuests.end()) {cout << "Charlie 已被邀请参加聚会!" << endl;} else {cout << "Charlie 没有被邀请。" << endl;}partyGuests.erase("Bob");  //  // 删除某个宾客 Bob 不来了,移除他cout << "当前聚会有 " << partyGuests.size() << " 位宾客。" << endl;    // 查看聚会的宾客人数if (partyGuests.empty()) {    // 查看聚会是否为空cout << "聚会没有宾客。" << endl;}partyGuests.clear();  // 聚会取消,清空所有宾客cout << "聚会已取消,清空所有宾客。" << endl;

自定义排序规则

  • set 会使用元素类型的 < 运算符对元素进行升序排序。
  • 可以通过指定自定义的比较器来改变排序规则,例如使用 greater<T> 来实现降序排序,或者自定义一个比较器来按特定的规则排序。
  • 自定义排序规则通常是通过提供一个**函数对象(结构体或函数指针)**实现的。
  • 对于基本类型(如 intdouble 等),默认按照升序排列。对于自定义类型(如类或结构体),set 默认使用 < 运算符进行排序。如果你没有为自定义类型定义 < 运算符,编译器会报错。

(按字符串长度排序)

假设你有一个 set 来存储字符串,并希望按字符串的长度进行排序(而不是字母顺序)。你可以通过自定义比较器来实现:

#include <iostream>
#include <set>
#include <string>
using namespace std;
// 自定义比较器,按字符串长度排序
struct CompareByLength {bool operator()(const string& a, const string& b) const {return a.length() < b.length();  // 按长度升序排列}
};
int main() {// 使用 lambda 表达式定义降序排序规则set<int, greater<int>> s;  s.insert(5);s.insert(2);s.insert(8);// 输出按降序排列的元素for (int num : s) {cout << num << " ";  // 输出 8 5 2 }set<string, CompareByLength> s;s.insert("apple");s.insert("banana");s.insert("kiwi");s.insert("orange");// 输出按字符串长度排序的元素for (const string& str : s) {cout << str << " ";  // 输出 kiwi apple orange banana}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车供应链 “剧变”开始,“智能感知潜在龙头”诞生

智能汽车产业链“剧变”已经开启&#xff0c;智能感知软硬件能力的权重正在不断被放大。 比如满足高阶泊车的第二代AK2超声波传感器、满足人机共驾场景需求的电子外后视镜&#xff08;CMS&#xff09;、iTOF 3D成像视觉感知&#xff08;用于舱内监控&#xff09;等新产品&…

Latex中表格添加底部文本注释并调整对齐

如何实现从第一个表到第三个表的转换&#xff0c; 其中主要涉及到两点&#xff1a; &#xff08;1&#xff09;底部脚注与表格自动对齐并缩进换行 &#xff08;2&#xff09;表格自适应页面宽度 底部脚注的对齐与换行缩进需要用到 \usepackage{threeparttable} \usepackage{…

SQL 查询方式比较:子查询与自连接

在 SQL 中&#xff0c;子查询和自连接是两种常见的查询方式&#xff0c;它们的功能虽然可以相同&#xff0c;但实现的方式不同。本文通过具体示例&#xff0c;深入探讨这两种查询方式&#xff0c;并配合数据展示&#xff0c;帮助大家理解它们的使用场景和差异。 数据示例 假设…

html基础-认识html

1.什么是html html是浏览器可以识别的的标记语言&#xff0c;我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…

linux 无网络安装mysql

下载地址 通过网盘分享的文件&#xff1a;mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz 链接: https://pan.baidu.com/s/1qm48pNfGYMqBGfoqT3hxPw?pwd0012 提取码: 0012 安装 解压 tar -zxvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz mv /usr/mysql-5.7.33-linux-glibc2.1…

利用高德API获取整个城市的公交路线并可视化(七)

本篇文章是对我们从高德拿到的公交/地铁的json文件的精细化处理的一个深入解析&#xff0c;通过对这些原始数据进行详细的清洗、转换和分析&#xff0c;我们通过对数据的质量和可用性的提升&#xff0c;来为后续的数据精细化处理和研究做基础数据的支撑&#xff0c;从而为后续的…

OGV格式如何转换成MP4格式?五款视频格式转换工具

在数字时代&#xff0c;视频已成为我们日常生活、工作和学习中不可或缺的一部分。而不同的设备和平台往往支持不同的视频格式&#xff0c;这就需要对视频进行格式转换。 OGV&#xff08;Ogg Video File&#xff09;是一种使用OGG开源格式的容器&#xff0c;用于存储带或不带音频…

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…

C语言小练习-打印字母倒三角

编写一个程序&#xff0c;在用户输入某个大写字母后&#xff0c;产生一个金字塔图案。 #include <stdio.h>int main(int argc,char *argv[]) {char ch; loop:printf("请输入大写字母&#xff01;\n");scanf("%c",&ch);getchar();if(ch < A ||…

FutureCompletableFuture实战

1. Callable&Future&FutureTask介绍 直接继承Thread或者实现Runnable接口都可以创建线程&#xff0c;但是这两种方法都有一个问题就是&#xff1a;没有返回值&#xff0c;也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景&#xff0c;而Fu…

什么是MyBatis

MyBatis是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。以下是关于MyBatis的详细介绍&#xff1a; 一、MyBatis的起源与发展 MyBatis本是Apache的一个开源项目iBATIS&#xff0c;2010年这个项目由Apache迁移到了Google Code&#xff0c;并且改名…

阿尔茨海默症数据集,使用yolo,voc,coco格式对2013张原始图片进行标注,可识别轻微,中等和正常的症状

阿尔茨海默症数据集,使用yolo&#xff0c;voc&#xff0c;coco格式对2013张原始图片进行标注&#xff0c;可识别轻微&#xff0c;中等&#xff0c;严重和正常的症状 数据集分割 训练组100&#xff05; 2013图片 有效集&#xff05; 0图片 测试集&#xf…

[代码随想录21二叉树]二叉树的修改和改造,修剪二叉树,将有序数组转为二叉搜索树

前言 二叉树章节最后的题目了&#xff0c;就是对搜索二叉树的改造&#xff0c; 题目链接 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 一、修剪二叉搜索树 思路&#xff1a;等会…

Android 13 Aosp SystemServer功能裁剪(PackageManager.hasSystemFeature())

系统定制,裁剪Wifi,bt等模块 UI部分可参考: SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口 Android系统启动后Zygote进程会forkSystemServer进程。SystemServer启动Andorid服务. frameworks/base/services/java/com/android/server/SystemServer.java if (contex…

Scala的惰性求值:深入理解与实践

在编程中&#xff0c;我们经常需要处理那些计算成本高昂或者可能永远不会用到的值。在这种情况下&#xff0c;惰性求值&#xff08;Lazy Evaluation&#xff09;是一种非常有用的策略。它允许我们推迟计算&#xff0c;直到这些值真正需要被使用。Scala&#xff0c;作为一种多功…

事务-介绍与操作四大特性

一.数据准备&#xff1a; 1.员工表&#xff1a; -- 员工管理 create table tb_emp (id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment 用户名,password varchar(32) default 123456 comment 密码,n…

Golang学习历程【第一篇 入门】

Golang学习历程【第一篇 入门Hello World】 1. 学习文档2. Window 本地安装Go2.1 安装2.2 验证 3. 开发环境——VsCode3.1 VsCode 安装3.2 安装插件3.2.1 language 语言汉化插件安装3.2.2 Go插件安装 4. Hello World 入门4.1 建工程4.2 创建项目文件4.3 编写Hello World程序4.4…

微积分复习笔记 Calculus Volume 2 - 4.3 Separable Equations

4.3 Separable Equations - Calculus Volume 2 | OpenStax

Day43 动态规划part10

300.最长递增子序列 今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。 视频讲解:动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列_哔哩哔哩_bilibili 代码随想录 class Solution {public int lengthOfLIS(int[] nums) {int[] …

Doris SQL 特技

group_concat description Syntax VARCHAR GROUP_CONCAT([DISTINCT] VARCHAR str[, VARCHAR sep] [ORDER BY { col_name | expr} [ASC | DESC]) 该函数是类似于 sum() 的聚合函数&#xff0c;group_concat 将结果集中的多行结果连接成一个字符串。第二个参数 sep 为字符串之…