C/C++藍橋杯算法真題打卡(Day3)

一、P8598 [藍橋杯 2013 省 AB] 錯誤票據 - 洛谷

算法代碼:

#include<bits/stdc++.h>
using namespace std;int main() {int N;cin >> N;  // 讀取數據行數unordered_map<int, int> idCount;  // 用于統計每個ID出現的次數vector<int> ids;                  // 用于存儲所有ID(方便排序)int num;// 讀取所有IDfor (int i = 0; i < N; i++) {while (cin >> num) {ids.push_back(num);  // 將ID存入vectoridCount[num]++;      // 統計ID出現的次數if (cin.get() == '\n') break;  // 換行時結束當前行的讀取}}// 對ID進行排序sort(ids.begin(), ids.end());int missing = -1, duplicate = -1;  // 斷號ID和重號ID// 查找重號for (auto& pair : idCount) {if (pair.second == 2) {duplicate = pair.first;  // 找到重號break;}}// 查找斷號for (int i = ids[0]; i <= ids.back(); i++) {if (idCount.find(i) == idCount.end()) {missing = i;  // 找到斷號break;}}// 輸出結果cout << missing << " " << duplicate << endl;return 0;
}

代碼思路

?1. 輸入處理

  • 讀取數據行數?N
  • 使用?unordered_map<int, int>?統計每個ID出現的次數。
  • 使用?vector<int>?存儲所有ID,方便后續排序。

?2. 讀取所有ID

  • 使用?while (cin >> num)?逐行讀取ID,直到遇到換行符?\n?結束當前行的讀取。
  • 將每個ID存入?vector<int> ids?中,并在?unordered_map<int, int> idCount?中統計其出現次數。

?3. 排序

  • 對?vector<int> ids?進行排序,方便后續查找斷號和重號。

?4. 查找重號

  • 遍歷?unordered_map<int, int> idCount,找到出現次數為2的ID,即為重號。

?5. 查找斷號

  • 從最小ID(ids[0])到最大ID(ids.back())遍歷,檢查每個ID是否在?unordered_map<int, int> idCount?中。
  • 如果某個ID不在?unordered_map?中,則說明它是斷號。

?6. 輸出結果

  • 輸出斷號ID?missing?和重號ID?duplicate

?代碼實現細節

?1. 頭文件

#include<bits/stdc++.h>
using namespace std;
  • 使用萬能頭文件?bits/stdc++.h,包含所有標準庫。
  • 使用?using namespace std,避免每次調用標準庫時需要寫?std::

?2. 主函數

int main() {int N;cin >> N;
  • 讀取數據行數?N

?3. 數據存儲

unordered_map<int, int> idCount;
vector<int> ids;
int num;
  • unordered_map<int, int> idCount:用于統計每個ID出現的次數。
  • vector<int> ids:用于存儲所有ID,方便后續排序。

?4. 讀取所有ID

for (int i = 0; i < N; i++) {while (cin >> num) {ids.push_back(num);idCount[num]++;if (cin.get() == '\n') break;}
}
  • 逐行讀取ID,存入?vector<int> ids?中。
  • 使用?unordered_map<int, int> idCount?統計每個ID出現的次數。
  • 當遇到換行符?\n?時,結束當前行的讀取。

?5. 排序

sort(ids.begin(), ids.end());
  • 對?vector<int> ids?進行排序,方便后續查找斷號和重號。

?6. 查找重號

int missing = -1, duplicate = -1;
for (auto& pair : idCount) {if (pair.second == 2) {duplicate = pair.first;break;}
}
  • 遍歷?unordered_map<int, int> idCount,找到出現次數為2的ID,即為重號。

?7. 查找斷號

for (int i = ids[0]; i <= ids.back(); i++) {if (idCount.find(i) == idCount.end()) {missing = i;break;}
}
  • 從最小ID(ids[0])到最大ID(ids.back())遍歷,檢查每個ID是否在?unordered_map<int, int> idCount?中。
  • 如果某個ID不在?unordered_map?中,則說明它是斷號。

?8. 輸出結果

cout << missing << " " << duplicate << endl;
  • 輸出斷號ID?missing?和重號ID?duplicate

?9. 返回

return 0;
  • 程序正常結束。

?示例運行

?輸入

2
7 9
5 6 8 11 9

?輸出

10 9

?總結

  • 代碼通過?unordered_map?統計ID出現次數,結合排序和遍歷,高效地找到斷號和重號。
  • 時間復雜度為?O(n),其中?n?是ID的總數。
  • 代碼邏輯清晰,適合處理題目描述中的場景。

還有另一種形式(不排序,直接使用哈希表):

#include <iostream>
#include <unordered_set>
using namespace std;int main() {int N;cin >> N;  // 讀取數據行數unordered_set<int> idSet;  // 用于存儲所有IDint minID = INT_MAX, maxID = INT_MIN;  // 記錄最小ID和最大IDint num;// 讀取所有IDfor (int i = 0; i < N; i++) {while (cin >> num) {idSet.insert(num);  // 將ID存入哈希表minID = min(minID, num);  // 更新最小IDmaxID = max(maxID, num);  // 更新最大IDif (cin.get() == '\n') break;  // 換行時結束當前行的讀取}}int missing = -1, duplicate = -1;  // 斷號ID和重號ID// 查找重號unordered_set<int> seen;for (int id : idSet) {if (seen.count(id)) {duplicate = id;  // 找到重號break;}seen.insert(id);}// 查找斷號for (int i = minID; i <= maxID; i++) {if (idSet.find(i) == idSet.end()) {missing = i;  // 找到斷號break;}}// 輸出結果cout << missing << " " << duplicate << endl;return 0;
}

二、P8775 [藍橋杯 2022 省 A] 青蛙過河 - 洛谷?

算法代碼:?

#include <bits/stdc++.h>
#define N 100005
using namespace std;int n, T, h[N], ans;int main() {// 讀取河的寬度 n 和需要去學校的天數 Tscanf("%d%d", &n, &T);// 將 T 乘以 2 得到實際過河的次數T <<= 1;// 讀取每塊石頭的高度for (int i = 1; i < n; ++i) scanf("%d", &h[i]);// 使用滑動窗口的方法來找到滿足條件的最小跳躍能力for (int i = 1, j = 0, sum = 0; i < n; i++) {// 擴展窗口的右邊界,直到累加的高度大于等于 Twhile (j < n && sum < T) sum += h[++j];// 記錄當前窗口的長度,即跳躍能力ans = max(ans, j - i + 1);// 縮小窗口的左邊界,減去左邊石頭的高度sum -= h[i];}// 輸出滿足條件的最小跳躍能力printf("%d\n", ans);return 0;
}

規律:

????????對于一個跳躍能力?y,青蛙能跳過河?2x?次,當且僅當對于每個長度為?y?的區間,這個區間內?h?的和都大于等于?2x

????????這個問題涉及到對青蛙跳躍能力和石頭高度分布的分析。我們需要理解為什么對于一個跳躍能力?y,青蛙能夠跳過河?2x次,當且僅當對于每個長度為?y?的區間,這個區間內石頭高度?h?的和都大于等于?2x。


1.?問題背景

  • 青蛙需要往返?2x?次,每次跳躍必須落在石頭或岸上。

  • 每塊石頭的高度?h[i]表示這塊石頭可以被踩的次數。

  • 跳躍能力?y?表示青蛙一次跳躍的最大距離。


2.?跳躍能力?y?的含義

  • 如果青蛙的跳躍能力是?y,那么它每次跳躍的距離不能超過?y。

  • 這意味著青蛙在跳躍時,只能選擇距離當前位置不超過?y?的石頭。


3.?為什么需要每個長度為?y?的區間和 ≥2x

  • 必要性

    • 如果存在一個長度為?y的區間,其石頭高度和 <2x,那么青蛙在這個區間內無法完成?2x?次跳躍。

    • 因為青蛙每次跳躍必須落在石頭上,而石頭的高度限制了可以被踩的次數。

    • 如果某個區間的石頭高度和不足 2x,青蛙在這個區間內無法完成足夠的跳躍次數。

  • 充分性

    • 如果每個長度為?y?的區間的石頭高度和 ≥2x,那么青蛙可以在每個區間內完成足夠的跳躍次數。

    • 因為青蛙的跳躍能力是?y,它可以在每個區間內自由選擇石頭進行跳躍,而不會受到石頭高度不足的限制。


4.?具體分析

  • 青蛙的跳躍路徑

    • 青蛙需要從起點跳到終點,再跳回起點,重復?x?次。

    • 每次跳躍的距離不能超過?y。

  • 區間的劃分

    • 將河分成若干個長度為?y?的區間。

    • 每個區間內的石頭高度和必須≥2x,因為青蛙需要在這些區間內完成?2x2x?次跳躍。

  • 石頭高度的作用

    • 每塊石頭的高度?h[i] 表示這塊石頭可以被踩的次數。

    • 如果某個區間的石頭高度和<2x,那么青蛙在這個區間內無法完成 2x?次跳躍。


5.?舉例說明

假設:

  • 河的寬度?n=5。

  • 需要去學校的天數?x=1,實際過河次數 2x=2。

  • 石頭高度?h=[3,1,2,1]。

跳躍能力?y=2

  • 區間劃分:

    • 區間 1: 位置 1 和 2,高度和 3+1=4≥2。

    • 區間 2: 位置 2 和 3,高度和 1+2=3≥2。

    • 區間 3: 位置 3 和 4,高度和 2+1=3≥2。

  • 每個區間的石頭高度和都?≥2,因此青蛙可以完成?2?次跳躍。

跳躍能力 y=1

  • 區間劃分:

    • 區間 1: 位置 1,高度和 3≥2。

    • 區間 2: 位置 2,高度和 1<2。

    • 區間 3: 位置 3,高度和 2≥2。

    • 區間 4: 位置 4,高度和 1<2。

  • 存在區間的石頭高度和?<2,因此青蛙無法完成?2?次跳躍。


6.?總結

  • 對于一個跳躍能力?y,青蛙能夠跳過河 2x?次,當且僅當對于每個長度為?y?的區間,這個區間內石頭高度?h?的和都大于等于 2x。

  • 這是因為青蛙的跳躍能力限制了它每次跳躍的距離,而石頭的高度限制了它可以在每塊石頭上踩的次數。

  • 如果某個區間的石頭高度和不足2x,青蛙在這個區間內無法完成足夠的跳躍次數。

  • 如果每個區間的石頭高度和都 ≥2x,青蛙可以在每個區間內自由選擇石頭進行跳躍,完成?2x次跳躍。


代碼思路:

這段代碼的目的是通過滑動窗口的方法,找到小青蛙的最小跳躍能力?y,使得它能夠完成?2x?次往返跳躍。以下是代碼的詳細思路:


1.?輸入處理

  • 讀取河的寬度?n?和需要去學校的天數?T

    • 使用?scanf("%d%d", &n, &T);?讀取輸入。

    • 河的寬度?n?表示從起點到終點共有?n?個位置(包括起點和終點)。

    • T?是小青蛙需要去學校的天數,實際過河次數是?2T(往返各一次)。

  • 將?T乘以 2

    • 使用?T <<= 1;?將?T左移一位,相當于?T=2T,表示實際過河次數。


2.?讀取石頭高度

  • 讀取每塊石頭的高度

    • 使用?for (int i = 1; i < n; i++) scanf("%d", &h[i]);?讀取每塊石頭的高度。

    • 數組?h?的下標從 1 開始,表示從起點到終點之間的?n?1塊石頭的高度。

    • h[i]表示距離起點?i的位置的石頭高度。


3.?滑動窗口尋找最小跳躍能力

  • 初始化滑動窗口

    • 使用?for (int i = 1, j = 0, sum = 0; i < n; ++i)?初始化滑動窗口。

    • i是窗口的左邊界,表示當前跳躍的起點。

    • j是窗口的右邊界,表示當前跳躍的終點。

    • sum 是窗口內石頭高度的累加和。

  • 擴展窗口的右邊界

    • 使用?while (j < n && sum < T) sum += h[++j];?擴展窗口的右邊界。

    • 不斷將右邊界?j向右移動,累加石頭的高度,直到累加的高度?sum大于等于?T。

    • 這一步的目的是找到一個窗口,使得窗口內的石頭高度總和足夠支持?2T?次跳躍。

  • 記錄窗口的長度

    • 使用?ans = max(ans, j - i + 1);?記錄當前窗口的長度。

    • 窗口的長度?j?i+1表示當前跳躍能力?y。

    • 通過取最大值,確保找到最小的跳躍能力。

  • 縮小窗口的左邊界

    • 使用?sum -= h[i];?縮小窗口的左邊界。

    • 將左邊界?i?向右移動,減去左邊石頭的高度,繼續尋找更小的跳躍能力。


4.?輸出結果

  • 輸出滿足條件的最小跳躍能力

    • 使用?printf("%d\n", ans);?輸出結果。

    • ans 是滿足條件的最小跳躍能力?yy。


代碼的核心思想:

  • 滑動窗口

    • 通過滑動窗口的方法,動態調整窗口的左右邊界,找到一個最小的窗口長度?y,使得窗口內的石頭高度總和至少為?T。

    • 窗口的長度?y?表示小青蛙的跳躍能力。

  • 跳躍能力的定義

    • 跳躍能力?y?表示小青蛙一次跳躍的最大距離。

    • 通過滑動窗口找到的?y是最小的跳躍能力,使得小青蛙能夠完成?2T?次跳躍。


代碼的優化點:

  1. 滑動窗口的邊界處理

    • 窗口的右邊界?j?不能超過?n,否則會越界。

    • 窗口的左邊界?i?逐步向右移動,確保窗口長度最小。

  2. 時間復雜度

    • 滑動窗口的時間復雜度是?O(n),因為每個石頭最多被訪問兩次(一次擴展右邊界,一次縮小左邊界)。

    • 這種方法在?n≤10**5 的規模下非常高效。


總結:

這段代碼通過滑動窗口的方法,高效地找到了小青蛙的最小跳躍能力?y,使得它能夠完成?2T?次往返跳躍。滑動窗口的核心思想是動態調整窗口的左右邊界,確保窗口內的石頭高度總和滿足條件,同時找到最小的窗口長度?y。

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

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

相關文章

<建模軟件安裝教程1>Blender4.2系列

Blender4.2安裝教程 0注意&#xff1a;Windows環境下安裝 第一步&#xff0c;百度網盤提取安裝包。百度網盤鏈接&#xff1a;通過網盤分享的文件&#xff1a;blender.zip 鏈接: https://pan.baidu.com/s/1OG0jMMtN0qWDSQ6z_rE-9w 提取碼: 0309 --來自百度網盤超級會員v3的分…

C語言八股---預處理,編譯,匯編與鏈接篇

前言 從多個.c文件到達一個可執行文件的四步: ??預處理–>編譯–>匯編–>鏈接 預處理 預處理過程就是預處理器處理這些預處理指令(要不然編譯器完全不認識),最終會生成 main.i的文件 主要做的事情有如下幾點: 展開頭文件展開宏條件編譯刪除注釋添加行號等信息保留…

用Deepseek寫一個 HTML 和 JavaScript 實現一個簡單的飛機游戲

大家好&#xff01;今天我將分享如何使用 HTML 和 JavaScript 編寫一個簡單的飛機游戲。這個游戲的核心功能包括&#xff1a;控制飛機移動、發射子彈、敵機生成、碰撞檢測和得分統計。代碼簡潔易懂&#xff0c;適合初學者學習和實踐。 游戲功能概述 玩家控制&#xff1a;使用鍵…

面向高質量視頻生成的擴散模型方法-算法、架構與實現【附核心代碼】

目錄 算法原理 架構 代碼示例 算法原理 正向擴散過程&#xff1a;從真實的視頻數據開始&#xff0c;逐步向其中添加噪聲&#xff0c;隨著時間步 t 的增加&#xff0c;噪聲添加得越來越多&#xff0c;最終將原始視頻數據變成純噪聲。數學上&#xff0c;t 時刻的視頻數據與 t…

水下機器人推進器PID參數整定與MATLAB仿真

水下機器人推進器PID參數整定與MATLAB仿真 1. PID控制原理 目標:通過調節比例(P)、積分(I)、微分(D)參數,使推進器輸出力快速穩定跟蹤期望值。傳遞函數(示例):推進器動力學模型可簡化為: [ G(s) = \frac{K}{\tau s + 1} \cdot e^{-Ts} ] 其中:K為增益,τ為時間常…

游戲引擎學習第149天

今日回顧與計劃 在今天的直播中&#xff0c;我們將繼續進行游戲的開發工作&#xff0c;目標是完成資產文件&#xff08;pack file&#xff09;的測試版本。目前&#xff0c;游戲的資源&#xff08;如位圖和聲音文件&#xff09;是直接從磁盤加載的&#xff0c;而我們正在將其轉…

Java函數式接口四部曲之Consumer

Consumer 是一個函數式接口&#xff0c;位于 java.util.function 包中。它表示一個接受單個輸入參數并且不返回任何結果的操作。Consumer 通常用于需要對輸入參數執行某些操作但不產生返回值的場景。 Consumer 接口定義了一個抽象方法&#xff1a;accept(T t)&#xff1a;接受…

ForceMimic:以力為中心的模仿學習,采用力運動捕捉系統進行接觸豐富的操作

25年3月來自上海交大盧策吾教授團隊的論文“ForceMimic: Force-Centric Imitation Learning with Force-Motion Capture System for Contact-Rich Manipulation”。 在大多數接觸豐富的操作任務中&#xff0c;人類會將隨時間變化的力施加到目標物體上&#xff0c;以補償視覺引…

【愚公系列】《Python網絡爬蟲從入門到精通》045-Charles的SSL證書的安裝

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯&#xff0c;華為云云享專家&#xff0c;華為開發者專家&#xff0c;華為產品云測專家&#xff0c;CSDN博客專家&#xff0c;CSDN商業化專家&#xff0c;阿里云專家博主&#xff0c;阿里云簽約作者&#xff0c;騰訊云優秀博主&…

vulnhub靶場【digitalworld.local系列】的electrical靶機

前言 靶機&#xff1a;digitalworld.local-electrical&#xff0c;IP地址為192.168.10.12&#xff0c;后期因為卡頓&#xff0c;重新安裝&#xff0c;ip地址后面為192.168.10.11 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 kali采用VMware虛擬機&#xff0c;靶機…

macos 程序 運行

sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件

多視圖幾何--結構恢復--三角測量

三角測量 1. 核心公式推導 假設兩個相機的投影矩陣為 P P P 和 P ′ P P′&#xff0c;對應的匹配圖像點(同名點)為 ( u , v ) (u, v) (u,v) 和 ( u ′ , v ′ ) (u, v) (u′,v′)&#xff0c;目標是求解三維點 X [ X x , X y , X z , 1 ] T X [X_x, X_y, X_z, 1]^T X…

共享內存的原理和創建

目錄 共享內存的原理 共享內存的創建 代碼實現創建 共享內存的管理指令 我們今天來學習共享內存&#xff01;&#xff01;&#xff01; 共享內存的原理 兩個進程同時使用內存中開辟的共享空間進行通信就是建立并使用共享內存進行進程間的通信。System V 共享內存&#xf…

3.10[A]cv

核心模塊&#xff1a; rasterizer&#xff1a;光柵化器&#xff0c;負責三角形遍歷和像素繪制Shader&#xff1a;包含頂點著色器和多種片元著色器Texture&#xff1a;紋理處理模塊 頂點著色器的計算量一般遠小于片元著色器。因為組成三角形的頂點相對有限&#xff0c;而片元需…

mac使用Homebrew安裝miniconda(mac搭建python環境),并在IDEA中集成miniconda環境

一、安裝Homebrew mac安裝brew 二、使用Homebrew安裝miniconda brew search condabrew install miniconda安裝完成后的截圖&#xff1a; # 查看是否安裝成功 brew list環境變量&#xff08;無需手動配置&#xff09; 先執行命令看能不能正常返回&#xff0c;如果不能正常…

多視圖幾何--相機標定--從0-1理解張正友標定法

1基本原理 1.1 單應性矩陣&#xff08;Homography&#xff09;的建立 相機模型&#xff1a;世界坐標系下棋盤格平面&#xff08;Z0&#xff09;到圖像平面的投影關系為&#xff1a; s [ u v 1 ] K [ r 1 r 2 t ] [ X Y 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} K…

WWDG窗口看門狗原理

WWDG&#xff08;窗口看門狗&#xff09;在窗口期喂狗 作用&#xff1a; 原理&#xff1a; 框圖 WWDG寄存器&#xff1a; WWDG_CR控制寄存器 WWDG_CFR配置寄存器 狀態寄存器WWDG_SR 超時時間計算公式 最小最大超時值 HAL配置函數&#xff1a; 1. IWDG 和 WWDG 的區別 IWDG&…

無公網IP也能遠程控制Windows:Linux rdesktop內網穿透實戰

文章目錄 前言1. Windows 開啟遠程桌面2. Linux安裝rdesktop工具3. Win安裝Cpolar工具4. 配置遠程桌面地址5. 遠程桌面連接測試6. 設置固定遠程地址7. 固定地址連接測試 前言 如今遠程辦公已經從一種選擇變成了許多企業和個人的必修課&#xff0c;而如何在Linux系統上高效地訪…

Pygame實現射擊鴨子游戲3-2

2 鴨子類Target的創建 2.1 __init__()函數 Target類的__init__()函數代碼如圖5所示。 圖5 __init__()函數代碼 其中&#xff0c;第18行將Target類聲明為pygame.sprite.Sprite類的子類&#xff1b;第19行代碼中&#xff0c;__init__()函數的img_path參數表示鴨子圖片的文件名…

利用Java爬蟲獲取衣聯網商品詳情:實戰指南

在電商領域&#xff0c;獲取商品詳情是數據分析和市場研究的重要環節。衣聯網作為知名的電商平臺&#xff0c;提供了豐富的服裝商品資源。本文將詳細介紹如何利用Java編寫爬蟲程序&#xff0c;通過商品ID獲取衣聯網商品詳情。 一、準備工作 &#xff08;一&#xff09;環境搭…