洛谷P2234 [HNOI2002] 营业额统计(c嘎嘎)

题目链接P2234 [HNOI2002] 营业额统计 - 洛谷 | 计算机科学教育新生态

题目难度 :普及/提高

解题思路 :这道题可以用STL 中的set容器 来做,set能有序地维护同一类型的元素,但相同的元素只能出现一次,用set记录下之前出现的所有营业额,每次输入一个新的营业额,就用lower_bound找到大于等于当前营业额的第一个数。如果是第一天的营业额直接插入容器,如果lower_bound找到的值和当前值一样,就不用插入当前营业额了(set不记录重复的数据)如果当前营业额数大于x,通过set的特性可以很轻松的找到这个数的前驱,也就是小于x的第一个数。将两个数分别减去x,对绝对值取个min就好了。此时要将x插入到set中。

set的基本基本概念

set 的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。

一些特点

1.每个元素的键值都唯一,不允许两个元素有相同的键值。

2.所有元素都会根据元素的键值自动排序(默认从小到大)。

set 的基本操作

复制代码
s.begin()					//返回指向第一个元素的迭代器
s.end()						//返回指向最后一个元素的迭代器
s.clear()					//清除所有元素
s.count()					//返回某个值元素的个数
s.empty()					//如果集合为空,返回true,否则返回false
s.equal_range()				//返回集合中与给定值相等的上下限的两个迭代器
s.erase()					//删除集合中的元素
s.find(k)					//返回一个指向被查找到元素的迭代器
s.insert()					//在集合中插入元素
s.lower_bound(k)			//返回一个迭代器,指向键值大于等于k的第一个元素
s.upper_bound(k)			//返回一个迭代器,指向键值大于k的第一个元素
s.max_size()				//返回集合能容纳的元素的最大限值
s.rbegin()					//返回指向集合中最后一个元素的反向迭代器
s.rend()					//返回指向集合中第一个元素的反向迭代器
s.size()					//集合中元素的数目

lower_bound()、upper_bound() 的用法

lower_bound(key_value) :返回第一个大于等于key_value的定位器

upper_bound(key_value):返回第一个大于key_value的定位器

下面奉上代码部分:

复制代码
#include<bits/stdc++.h>  // 万能头文件
using namespace std;
typedef long long ll;
const int N = 100010;     
set<int>s;//set 
set<int>::iterator p,t; //用来调用迭代器 
int n; 
int sum;//记录波动总值 

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    cin >> n;
    
    s.insert(1000000000);
    s.insert(-100000000);
    for(int i=1; i<=n; i++)
    {
        int x;
    	cin >> x;	
    	if(s.size() == 2)//第一天的营业额直接加到 sum
    	{
    		s.insert(x);
    		sum += x;
		}
		else
		{
			p = s.lower_bound(x);
			if(*p != x) //找到的数不等于当前营业额 
			{
				t = p;
				t--; // t 是 p 的前一个元素,即小于 x 的最大元素
				sum +=min(abs(*t - x),abs(*p - x));
				s.insert(x);
			}
		}
	}
    
   	cout<<sum;
    return 0;  
}
相关推荐
草莓熊Lotso16 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM22 分钟前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
feiyangqingyun34 分钟前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
CV点灯大师37 分钟前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl1 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康1 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康1 小时前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting
成工小白2 小时前
【C++ 】智能指针:内存管理的 “自动导航仪”
开发语言·c++·智能指针
sc写算法2 小时前
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
开发语言·c++·json