Set 二分 -> 劍指算法競賽

C++【STL】集合set

標準庫提供 set 關聯容器分為:

按關鍵字有序保存元素:set(關鍵字即值,即只保存關鍵字的容器)、multiset(關鍵字可重復出現的 set);
無序集合:unordered_set(用哈希函數組織的 set)、unordered_multiset(用哈希函數組織的 set,關鍵字可以重復出現)。

  ----集合--set:----------集合三要素----------------------------特點----------set---------multiste-----------unordered_set確定性 ? ? ? ?YES ? ? ? ? ? ?YES ? ? ? ? ? ? ? YES互異性 ? ? ? ?YES ? ? ? ? ? ?NO ? ? ? ? ? ? ? ?YES無序性 ? ? ? ?NO ? ? ? ? ? ? NO ? ? ? ? ? ? ? ?YES------------------------------------------------------------

優點:自動排序,自動去重?

set的定義

    set<類型名> 變量名;

同樣也可以定義set數組。

    set<int> arr[10];

?set的遍歷

for(set<int>::iterator it=se.begin();it!=se.end();it++){if(sign){cout<<*it;sign=0;}else{cout<<' '<<*it;}}

注意:除了 vector 和 string 以外的 STL 容器都不支持 *(it + i) 的訪問方式

?常見操作

插入元素:數組名.insert();unordered_set時間復雜度為O(1),set為O(log N);
刪除元素:數組名.erase();
查找元素:數組名.find()-----也可以用:數組名.count()會返回查找元素的個數
查看大小:數組名.size()
判空 ? ?:數組名.empty()
清空 ? ?:數組名.clear()

常見操作具體用法:內容參考?

由于set的用處并不是經常考,一些單一用set的題目過于簡單,寫上去有點太水了,因為我發誓以后不寫水博客了,所以以后有更好的用搭配set優化的題目我再補充。

【算法】常見二分

下面來總結一下二分的板子:

為了方便以后的比賽整理模板,今天就先把二分的模板整理到這里了,有同樣需求的小伙伴直接收藏即可。

二分查找:

使用前提:數組有序排列

參數為起始迭代器、終止迭代器以及給定元素值

lower_bound()?:返回第一個大于等于給定元素的位置

upper_bound():返回第一個小于給定元素的位置

用法

?1.查找元素是否存在:

bool check(vector<int>& v, int value) {auto it = lower_bound(v.begin(), v.end(), value);return it != v.end() && *it == value;
}

2.向有序數組中插入元素:

void insert_to_sorted(vector<int>& v, int value) {auto pos = lower_bound(v.begin(), v.end(), value);v.insert(pos, value);
}

?

3.查找范圍:

auto range = equal_range(v.begin(), v.end(), value);
// 等同于:
auto low = lower_bound(v.begin(), v.end(), value);
auto up = upper_bound(v.begin(), v.end(), value);

二分答案:

二分答案是一種對答案進行二分查找的算法,適用于滿足以下條件的問題:

問題的答案具有單調性(隨著某個變量的增大,結果單調遞增或遞減)

可以相對容易地驗證某個候選答案是否可行

與傳統的二分查找比較:

二分答案的模板有很多,我會總結出我經常用到的一種:

首先是整數二分答案模板:

整形二分

如果求的是最大的最小值(滿足條件的最大值,較靠右端的答案)可以用(l+r+1)>>1;

如果是求最小的最大值(滿足條件的最小值,較靠左端的答案),可以用(l+r)>>1;

int l=1,r=1e18;while(l<r){int mid = (l+r+1)>>1;if(check(mid)) l = mid(r = mid);//更新左/右邊界else r = mid-1(l = mid + 1);//更新左/右邊界}cout<<l<<endl;

二分答案難就難在check函數的編寫,check函數顧名思義就是把當前的mid(可能的答案值)代入問題中看是否符合要求 。

有了理論和模板,下面就是不斷的練習了:

進擊的奶牛

這道題題目意思讀不懂,但是和跳石頭差不多,直接寫就行了。

check函數的難點在于需要用一個變量來存儲上一個選擇的位置。

// Problem: P1824 [USACO05FEB] 進擊的奶牛 Aggressive Cows G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1824
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define PII pair<int,int>
#define fi first
#define se second
const int N = 1e5+10;
int a[N];
int n,m;bool check(int mid)
{int num=1;int f=1;for(int i=2;i<=n;i++){if(a[i] - f >= mid){num++;f = a[i];}}return num>=m;
}void solve()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);int l=1,r=1e18;while(l<r){int mid = (l+r+1)>>1;if(check(mid)) l = mid;else r = mid-1;}cout<<l<<endl;
}signed main()
{IOSint T=1;
//	cin>>T;while(T--) solve(); return 0;
} 

推薦練習題:

1、跳石頭

2、砍樹

3、冶煉金屬

浮點型二分

這中類型題的模板也有很多,有的是在給定的誤差范圍內進行微調,有的是判斷條件進行誤差分析并通過浮點數自身的精確度來調整答案,其中一種個人認為比較保險的是下面的這種:

double l = 0,r = 1e18;while(r - l > 1e-5){double mid = (l + r) / 2.0;if(check(mid)) l = mid;else r = mid;}

有了模板,難點同樣成為了check函數的編寫。。。

來看題目:
切繩子

這是一道基礎的題目,check函數很好想出來,這道題的難點反而成為了浮點二分答案的記憶

?只需要遍歷一遍看能切出來多少條繩子即可。

// Problem: P1577 切繩子
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1577
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define PII pair<int,int>
#define fi first
#define se second
int n,k;
const int N = 10010;
double a[N];
bool check(double mid)
{int num=0;for(int i=1;i<=n;i++){num += (int)(a[i] / mid);}	return num>=k;
}void solve()
{cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];double l = 0,r = 1e18;while(r - l > 1e-5){double mid = (l + r) / 2.0;if(check(mid)) l = mid;else r = mid;}printf("%.2f",l);
}signed main()
{// IOSint T=1;
//	cin>>T;while(T--) solve(); return 0;
} 

推薦練習題:

最佳牛圍欄

總結:

今天是第五天了,這周就屬今天最輕松了,之后這周末我會整理整理這周所學的內容,我們下周見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914073.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php的原生類

前言&#xff1a;累麻了&#xff01; 反射類 反射類 ReflectionClass&#xff1a;ReflectionClass 類報告了一個類的有關信息。正如其名用于映射反射一個類的類&#xff01; new ReflectionClass(MyClass) 會創建一個 ReflectionClass 實例&#xff0c;代表 MyClass 這個類。 …

PC網站和uniapp安卓APP、H5接入支付寶支付

首先我們需要完成支付寶賬號注冊&#xff0c;支持的賬號類型&#xff1a;支付寶企業賬號、支付寶個人賬號、個體工商戶。 到支付寶商家平臺 產品中心開通APP支付、手機網站支付、電腦網站支付的產品權限。 一、電腦PC網站接入 電腦PC網站支付是指商戶在電腦網頁展示商品或服務&…

MCU芯片內部的ECC安全機制

MCU&#xff08;微控制器單元&#xff09;芯片內部的 ECC&#xff08;錯誤檢測與糾正&#xff09;安全機制 是一種至關重要的硬件級可靠性技術&#xff0c;主要用于保護關鍵存儲單元&#xff08;如 SRAM、Flash、Cache&#xff09;中的數據完整性&#xff0c;防止因外部干擾或硬…

【自動駕駛】經典LSS算法解析——深度估計

LSS-Lift.Splat,Shoot 論文題目&#xff1a;Lift, Splat, Shoot: Encoding Images From Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 代碼&#xff1a;https://github.com/nv-tlabs/lift-splat-shoot 概括&#xff1a;先做深度估計和特征融合&#xff0c;然后投…

《【第八篇-圖片總結篇】Python圖片處理自動化:終極工廠!從裁剪壓縮到智能加水印,打造你的視覺內容生產流水線!》

在數字時代&#xff0c;圖片無處不在。然而&#xff0c;高質量的圖片背后&#xff0c;往往隱藏著繁瑣的后期處理&#xff1a;圖片文件太大導致加載慢&#xff1b;尺寸不符需要裁剪&#xff1b;版權保護要加水印&#xff1b; 為了兼容性還得批量轉換格式……這些重復、機械的工…

frame 與新窗口切換操作【selenium 】

&#x1f9ed; 一、切換到 iframe 內部進行操作在瀏覽器自動化測試中&#xff0c;iframe 是一個特別的存在。它相當于在當前頁面中嵌入了另一個獨立的 HTML 頁面。當我們試圖直接訪問 iframe 中的元素時&#xff0c;往往會發現定位不到&#xff0c;比如&#xff1a;elements w…

MYSQL C_API使用全解

文章目錄C_API&#xff08;簡單的&#xff09;安裝這個庫使用流程初始化連接mysql_init建立連接mysql_real_connect執行SQL語句mysql_query處理結果mysql_store_resultmsyql_use_resultmysql_num_rowsmsyql_free_resultmysql_num_fieldsmysql_fetch_row多線程安全關閉連接mysql…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二課——RGB轉YCbCr的FPGA硬件編程詳解

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程文件請關注…

RK3566/RK3568 Android11 修改selinux模式

概述RK3566/RK3568 Android11 SDK默認的selinux是Enforcing模式(強制模式)。Enforcing&#xff1a;強制模式&#xff1a;SELinux在運行中&#xff0c;且已經開始限制domain/type之間的驗證關系 Permisssive&#xff1a;寬容模式&#xff1a;SELinux在運行中&#xff0c;如果驗證…

iOS Widget 開發-3:Widget 的種類與尺寸(主屏、鎖屏、靈動島)

iOS 支持多種類型的 Widget&#xff0c;分布在主屏幕、鎖屏、靈動島、待機模式、控制中心等多個系統位置。每種 Widget 都有各自的尺寸、交互能力與限制。 本篇將系統梳理 iOS 當前支持的 Widget 類型與尺寸規格。主屏 Widget&#xff08;Home Screen Widgets&#xff09; 主屏…

ffmpeg 中 write_option()函數詳細注釋

author: hjjdebug date: 2025年 07月 11日 星期五 10:51:23 CST descrip: ffmpeg 中 write_option()函數詳細注釋 文章目錄1. 函數原型1.1 參數說明1.2 SpecifierOpt 說明符選項結構2. write_option 代碼注釋2.1 誰調用了write_option 函數?3. 小結:write_option()不僅在ffmpe…

PandaCoder重大產品更新-引入Jenkinsfile文件支持

寫在前面 安裝這個插件可以直接平替 Jenkinsfile Pro &#xff0c;節省200元關于插件介紹的處女篇&#xff1a;https://mp.weixin.qq.com/s/fwMEhmx8vxVlvfnipx09Ag為什么叫「熊貓編碼助手」&#xff1f; 熊貓是中國的國寶&#xff0c;備受世界喜愛&#xff0c;代表著中國特色和…

鏈表算法之【判斷鏈表中是否有環】

目錄 LeetCode-141題 LeetCode-141題 給定一個鏈表的頭節點&#xff0c;判斷鏈表中是否存在環 class Solution {public boolean hasCycle(ListNode head) {// checkif (head null || head.next null)return false;// 定義兩個指針&#xff0c;一個快指針[fast]&#xff0c…

Ubuntu 22.04安裝SQL Server指南

看起來在安裝過程中出現了問題&#xff0c;導致 mssql-server 沒有正確安裝。以下是排查和修復步驟&#xff1a;1. 檢查是否成功安裝了 mssql-server 運行以下命令&#xff0c;確認是否已安裝&#xff1a; dpkg -l | grep mssql-server如果沒有任何輸出&#xff0c;說明 mssql-…

Vue+ElementUI聊天室開發指南

Hi&#xff0c;我是布蘭妮甜 &#xff01;在現代Web應用中&#xff0c;實時聊天功能已成為許多社交平臺、協作工具和客戶支持系統的核心需求。本文將詳細介紹如何使用Vue.js框架配合ElementUI組件庫實現一個功能完整的聊天室應用。我們將從項目搭建開始&#xff0c;逐步實現用戶…

提升你的AI交互技能:使用Anthropic互動提示教程

探索Anthropic的互動式提示工程教程&#xff1a;讓Claude與你更默契 在當今人工智能世界中&#xff0c;熟練掌握有效的提示工程成為了與AI進行高效溝通的關鍵。Anthropic推出了一款全面且互動性強的教程&#xff0c;名為“Prompt Engineering Interactive Tutorial”&#xff0…

從 JavaFX WebView 遷移至 JxBrowser

長久以來&#xff0c;JavaFX 一直包含一個內置的 WebView 組件&#xff0c;這是在 Java 應用中渲染 Web 內容的一個穩定方案。然而&#xff0c;在更復雜或要求更高的使用場景中&#xff0c;它可能就不夠用了。因此&#xff0c;許多開發者轉向了像 JxBrowser 這樣的替代方案。 …

將 Go 應用從 x86 平臺遷移至 Amazon Graviton:場景剖析與最佳實踐

簡介 近年來&#xff0c;Amazon Graviton 處理器以其優越的性價比和強勁的性能&#xff0c;成為了構建高效、可擴展云原生應用的重要選擇。Graviton 采用基于 Arm64 架構的芯片&#xff0c;與傳統的 x86 架構相比存在不少架構差異。雖然 Go 天生對 Arm64 具有良好支持&#xf…

arcgis api for js 設置地圖服務請求帶有請求頭信息

通過地圖的config模塊的請求攔截器來設置請求頭信息&#xff0c;如下示例&#xff1a; 1、引入&#xff1a;‘esri/config’ 1、設置請求頭信息 import { loadArcgisModules } from /utils/map/mapLoadUtil export default { mounted() {this.loadMap()}, methods: {/** ****…

工業通信升級新選擇:耐達訊CCLINKIE轉Modbus TCP網關

在工業自動化系統中&#xff0c;協議轉換網關的選擇直接影響系統穩定性與通信效率。對于CCLINKIE轉Modbus TCP場景&#xff0c;耐達訊通信技術網關憑借以下特性&#xff0c;成為多個項目中的優選方案。技術選型要點協議兼容性支持CCLINKIE的令牌環機制與Modbus TCP的TCP/IP協議…