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

news2024/12/19 16:45:18

文章目录

  • [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 Charlie
    set<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.coloradmin.cn/o/2262265.html

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

相关文章

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景&#xff1a;现在有一个新需求&#xff0c;需要借助树结构来实现词库的分类管理&#xff0c;树的节点是不同的分类&#xff0c;不同的分类可以有自己的词库&#xff0c;所以父子节点是互不影响的&#xff1b;同样为了选择的方便性&#xff0c;提出了新需求&#xff0c;选择…

SAP-ABAP开发学习-面向对象开发ooalv(2)

SAP-ABAP开发学习-面向对象OOALV&#xff08;1&#xff09;-CSDN博客 本文目录 一、类的继承 多态性类继承的实现 二、抽象类 三、最终类 四、接口 五、定义全局对象 一、类的继承 继承的本质是代码重用。当我们要构造一个新类时&#xff0c;无需从零开始&#xff0c;可…

典型案例 | 旧PC新蜕变!东北师范大学依托麒麟信安云“旧物焕新生”

东北师范大学始建于1946年&#xff0c;坐落于吉林省长春市&#xff0c;是中国共产党在东北地区创建的第一所综合性大学。作为国家“双一流”建设高校&#xff0c;学校高度重视教学改革和科技创新&#xff0c;校园信息化建设工作始终走在前列。基于麒麟信安云&#xff0c;东北师…

Linux脚本语言学习--上

1.shell概述 1.1 shell是什么&#xff1f; Shell是一个命令行解释器&#xff0c;他为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序&#xff0c;用户可以使用Shell来启动&#xff0c;挂起&#xff0c;停止甚至是编写一些程序。 Shell还是一个功能相当强大…

2024年底-Sre面试问题总结-持续更新

这几个缩写 贴一下是因为真的会有人问:( SRE “Site Reliability Engineer” 站点可靠性工程师 SLA “Service Level Agreement” 服务可用性协议 CICD “Continuos Integration Continous Deployment” 持续集成 持续部署 3个高频问题 K8s生产环境中处理过哪些复杂 or 印象…

【硬件接口】I2C总线接口

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 I2C总线是一种非常常用的总线&#xff0c;其多用于一个主机&#xff08;或多个&#xff09;与单个或多个从设备通讯…

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用

目录 一&#xff0c;分发器和拦截器 二&#xff0c;分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三&#xff0c;分发器处理同步请求 四&#xff0c;拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…

SAP:如何修改已释放的请求

SAP:如何修改已释放的请求 QQ出了一个新功能&#xff0c;把10年前的旧日志推给自己。这个10年前的日志&#xff0c;是用户反映在SE10中把请求释放后发现漏了内容&#xff0c;想修改已释放的请求。经调查写了一个小程序&#xff0c;实现用户的需求。 *&-------------------…

python怎么循环嵌套

嵌套循环&#xff1a; 概念&#xff1a;循环中再定义循环&#xff0c;称为嵌套循环&#xff1b; 【注意】嵌套循环可能有多层&#xff0c;但是一般我们实际开发最多两层就可以搞定了(99%的情况) 格式&#xff1a; 1、while中套while常用 2、while中套for in 3、for in中套…

前端优雅(装逼)写法(updating····)

1.>>右位移运算符取整数 它将一个数字的二进制位向右移动指定的位数&#xff0c;并在左侧填充符号位&#xff08;即负数用1填充&#xff0c;正数用0填充&#xff09;。 比如 2.99934 >> 0&#xff1a;取整结果是2&#xff0c;此处取整并非四舍五入 2.99934 会先…

MySQL -- 库的相关操作

目录 查看数据库 创建数据库 直接创建&#xff1a; 加约束条件 if not exists 字符集和校对规则 什么是字符集 什么是校对规则 校对规则的主要功能 校对规则的特性 查看指定的数据库使用的字符集和校对规则&#xff1a; 比较是否区分大小写字母差异 显示创建语句 …

Moretl开箱即用日志采集

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

分享一次接口性能摸底测试过程

接口性能测试是用于验证应用程序中的接口是否可以满足系统的性能要求的一种测试方法。确定应用程序在各种负载条件下的性能指标&#xff0c;例如响应时间、吞吐量、并发性能等&#xff0c;以便提高系统的性能和可靠性。本文主要讲述接口性能测试从前期准备、方案设计到环境搭建…

【机器学习】机器学习的基本分类-无监督学习-t-SNE(t-分布随机邻域嵌入)

t-SNE&#xff08;t-分布随机邻域嵌入&#xff09; t-SNE&#xff08;t-distributed Stochastic Neighbor Embedding&#xff09;是一种用于降维的非线性技术&#xff0c;常用于高维数据的可视化。它特别适合展示高维数据在二维或三维空间中的分布结构&#xff0c;同时能够很好…

【教学类-83-03】20241218立体书盘旋蛇3.0——圆点蛇1(蚊香形)

背景需求&#xff1a; 制作儿童简易立体书贺卡 【教学类-83-01】20241215立体书三角嘴1.0——小鸡&#xff08;正菱形嘴&#xff09;-CSDN博客文章浏览阅读1k次&#xff0c;点赞24次&#xff0c;收藏18次。【教学类-83-01】20241215立体书三角嘴1.0——小鸡&#xff08;正菱形…

监控视频汇聚融合云平台一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…

JAVA 零拷贝技术和主流中间件零拷贝技术应用

目录 介绍Java代码里面有哪些零拷贝技术java 中文件读写方式主要分为什么是FileChannelmmap实现sendfile实现 文件IO实战需求代码编写实战IOTest.java 文件上传阿里云&#xff0c;测试运行代码看耗时为啥带buffer的IO比普通IO性能高&#xff1f;BufferedInputStream为啥性能高点…

云灾备技术

目录 云灾备分类与定义 云容灾定义与主要应用场景 云容灾定义 应用场景 云备份定义与主要应用场景 云备份定义 应用场景 云容灾参考模型与关键技术 云备份参考模型与关键技术 云灾备分类与定义 云容灾技术是指保护云数据中心业务持续性的灾备技术&#xff0c;它是云灾…

进程通信方式---共享映射区(无血缘关系用的)

5.共享映射区&#xff08;无血缘关系用的&#xff09; 文章目录 5.共享映射区&#xff08;无血缘关系用的&#xff09;1.概述2.mmap&&munmap函数3.mmap注意事项4.mmap实现进程通信父子进程练习 无血缘关系 5.mmap匿名映射区 1.概述 原理&#xff1a;共享映射区是将文件…

leetcode 面试经典 150 题:长度最小的子数组

链接长度最小的子数组题序号209题型数组解题方法滑动窗口难度中等 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件…