[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+∣1?5∣+∣2?1∣+∣5?5∣+∣4?5∣+∣6?5∣=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.pswp.cn/web/63343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63343.shtml
英文地址,請注明出處:http://en.pswp.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 為字符串之…