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

一、P11041 [藍橋杯 2024 省 Java B] 報數游戲 - 洛谷

算法代碼:

#include<bits/stdc++.h>
using namespace std;// 計算第 n 個滿足條件的數
long long findNthNumber(long long n) {long long low = 1, high = 1e18; // 二分查找范圍while (low < high) {long long mid = (low + high) / 2;// 計算 mid 以內 20 或 24 的倍數的個數long long count = mid / 20 + mid / 24 - mid / 120;if (count < n) {low = mid + 1;} else {high = mid;}}return low;
}int main() {long long n = 202420242024;long long result = findNthNumber(n);cout << result << endl;return 0;
}

代碼說明

  1. 二分查找

    • 通過二分查找確定第 n 個滿足條件的數。

    • 查找范圍從 1 到 1e18(足夠大的數)。

  2. 容斥原理

    • mid / 20:計算 mid 以內 20 的倍數的個數。

    • mid / 24:計算 mid 以內 24 的倍數的個數。

    • mid / 120:減去 20 和 24 的最小公倍數的個數(避免重復計算)。

  3. 時間復雜度

    • 二分查找的時間復雜度為 O(log N),效率非常高。

二、P8792 [藍橋杯 2022 國 A] 最大公約數 - 洛谷

算法代碼:?

#include<bits/stdc++.h>
#define int long long
#define lc 2*k
#define rc 2*k+1
using namespace std;
int n,a[1234567],cnt;
struct nord{int l,r,mx;
}t[1234567];
void build(int k,int l,int r){//建樹t[k].l=l,t[k].r=r;if (l==r){t[k].mx=a[l];return ;}int mid=(l+r)/2;build(lc,l,mid);build(rc,mid+1,r);t[k].mx=__gcd(t[lc].mx,t[rc].mx);
}
int ask(int k,int l,int r){//求區間gcdif (l<=t[k].l&&r>=t[k].r) return t[k].mx;int ans=0;int mid=(t[k].l+t[k].r)/2;if (l<=mid) ans=__gcd(ans,ask(lc,l,r));if (r>mid) ans=__gcd(ans,ask(rc,l,r));return ans;
}
main(){cin>>n;for (int i=1;i<=n;i++) cin>>a[i],cnt+=(a[i]==1?1:0);build(1,1,n);if (cnt){//特殊情況cout <<n-cnt;return 0;}int ans=1e9;int i=1;for (int j=1;j<=n;j++){//枚舉while (i<j&&ask(1,i+1,j)==1) i++;//一直往前走if (ask(1,i,j)==1) ans=min(ans,j-i);//成功了}if (ans==1e9) cout <<-1;//不合法else cout <<n+ans-1;return 0;
}

????????這段代碼的主要功能是解決一個與區間 GCD(最大公約數)相關的問題。以下是代碼的思路和邏輯分析:


代碼思路

1.?問題描述

  • 給定一個長度為?n?的數組?a

  • 目標是找到一個最短的區間?[i, j],使得該區間內所有元素的 GCD 為 1。

  • 如果存在這樣的區間,輸出將整個數組變為全 1 的最小操作次數;否則輸出 -1。

2.?核心邏輯

  • 特殊情況處理

    • 如果數組中已經有?cnt?個 1,則直接輸出?n - cnt,因為只需要將其他元素變為 1 即可。

  • 區間 GCD 計算

    • 使用線段樹維護區間 GCD,支持快速查詢任意區間的 GCD。

  • 滑動窗口枚舉

    • 使用雙指針?i?和?j?枚舉區間?[i, j]

    • 如果區間?[i, j]?的 GCD 為 1,則嘗試縮小窗口(移動?i)以找到更短的區間。

    • 記錄滿足條件的最短區間長度。

  • 結果計算

    • 如果找到滿足條件的區間,輸出?n + ans - 1(將整個數組變為全 1 的最小操作次數)。

    • 否則輸出 -1。


代碼邏輯分析

1.?線段樹構建

  • build?函數用于構建線段樹,每個節點存儲區間的左右邊界和區間 GCD。

  • 遞歸地將數組劃分為左右子區間,直到區間長度為 1。

  • 區間 GCD 通過?__gcd?函數計算。

2.?區間 GCD 查詢

  • ask?函數用于查詢區間?[l, r]?的 GCD。

  • 如果當前節點區間完全包含在查詢區間內,則直接返回節點值。

  • 否則遞歸查詢左右子區間,并計算 GCD。

3.?滑動窗口枚舉

  • 使用雙指針?i?和?j?枚舉區間。

  • 如果區間?[i, j]?的 GCD 為 1,則嘗試縮小窗口(移動?i)。

  • 記錄滿足條件的最短區間長度?ans

4.?結果計算

  • 如果找到滿足條件的區間,輸出?n + ans - 1

  • 否則輸出 -1。


代碼優化建議

  1. 變量命名

    • 變量名如?lcrcnord?等不夠直觀,建議改為更具描述性的名稱,如?left_childright_childNode?等。

  2. 代碼可讀性

    • 添加注釋,解釋關鍵邏輯和變量的含義。

    • 使用空格和換行符提高代碼的可讀性。

  3. 邊界條件處理

    • 確保數組下標從 1 開始,避免越界問題。

    • 在滑動窗口枚舉時,注意?i?和?j?的移動條件。

  4. 時間復雜度

    • 線段樹構建的時間復雜度為 O(n)。

    • 區間查詢的時間復雜度為 O(log n)。

    • 滑動窗口枚舉的時間復雜度為 O(n log n)。

    • 總體時間復雜度為 O(n log n),效率較高。


修正后的代碼

#include<bits/stdc++.h>
#define int long long
using namespace std;const int MAXN = 1234567;
int n, a[MAXN], cnt;struct Node {int l, r, mx;
} t[MAXN * 4];// 構建線段樹
void build(int k, int l, int r) {t[k].l = l, t[k].r = r;if (l == r) {t[k].mx = a[l];return;}int mid = (l + r) / 2;build(2 * k, l, mid);build(2 * k + 1, mid + 1, r);t[k].mx = __gcd(t[2 * k].mx, t[2 * k + 1].mx);
}// 查詢區間 GCD
int ask(int k, int l, int r) {if (l <= t[k].l && r >= t[k].r) return t[k].mx;int ans = 0;int mid = (t[k].l + t[k].r) / 2;if (l <= mid) ans = __gcd(ans, ask(2 * k, l, r));if (r > mid) ans = __gcd(ans, ask(2 * k + 1, l, r));return ans;
}signed main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];cnt += (a[i] == 1 ? 1 : 0);}build(1, 1, n);// 特殊情況:數組中已經有 1if (cnt) {cout << n - cnt << endl;return 0;}int ans = 1e9;int i = 1;// 滑動窗口枚舉for (int j = 1; j <= n; j++) {while (i < j && ask(1, i + 1, j) == 1) i++;if (ask(1, i, j) == 1) ans = min(ans, j - i + 1);}// 輸出結果if (ans == 1e9) cout << -1 << endl;else cout << n + ans - 1 << endl;return 0;
}

總結

????????這段代碼通過線段樹和滑動窗口的結合,高效地解決了區間 GCD 問題。修正后的代碼提高了可讀性和健壯性,同時保留了原有的高效邏輯。

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

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

相關文章

【Python 數據結構 10.二叉樹】

目錄 一、二叉樹的基本概念 1.二叉樹的定義 2.二叉樹的特點 3.特殊的二叉樹 Ⅰ、斜樹 Ⅱ、滿二叉樹 Ⅲ、完全二叉樹 Ⅳ、完全二叉樹和滿二叉樹的區別 4.二叉樹的性質 5.二叉樹的順序存儲 Ⅰ、完全二叉樹 Ⅱ、非完全二叉樹 Ⅲ、稀疏二叉樹 6.二叉樹的鏈式存儲 7.二叉樹的遍歷概念…

Windows 系統 Docker Desktop 入門教程:從零開始掌握容器化技術

文章目錄 前言一、Docker 簡介二、Docker Desktop 安裝2.1 系統要求2.2 安裝步驟 三、Docker 基本概念四、Docker 常用命令五、實戰&#xff1a;運行你的第一個容器5.1 拉取并運行 Nginx 容器5.2 查看容器日志5.3 停止并刪除容器 六、總結 前言 隨著云計算和微服務架構的普及&…

可變參數與遞歸

可變參數與遞歸 可變參數 package method; ? public class Demo03 {public static void main(String[] args) {Demo03 demo03new Demo03();demo03.test(1,2,3);?}public void test (int... i){System.out.println(i[0]);//1System.out.println(i[1]);//2System.out.println(…

【redis】全局命令exists、del、expire、ttl(惰性刪除和定期刪除)

exists——判定 key 是否存在 語法&#xff1a; exists key [key...] # 返回值&#xff1a;key 存在的個數針對多個 key 來說&#xff0c;是非常有用的時間復雜度 O ( 1 ) O(1) O(1) Redis 組織這些 key 就是按照哈希表的方式來組織的。Redis 支持很多數據結構指的是 value …

系統架構設計師—系統架構設計篇—特定領域軟件體系結構

文章目錄 概述領域分類垂直域水平域 系統模型基本活動參與角色 概述 特定領域軟件架構&#xff08;Domain Specific Software Architecture&#xff0c;DSSA&#xff09;是在一個特定應用領域中&#xff0c;為一組應用提供組織結構參考的標準團建體系結構。 領域分類 垂直域…

OpenManus:優點突出,短板也明顯

最近&#xff0c;OpenManus 在 AI 領域掀起了一陣熱潮。作為開源版的智能代理軟件&#xff0c;它自誕生起就備受矚目。今天&#xff0c;咱們就來深入聊聊 OpenManus 在實際測試中的表現&#xff0c;看看它到底有哪些過人之處&#xff0c;又存在哪些不足。? 優點大起底? 開源…

VUE3項目的文檔結構分析

1. Vue 3 項目的文檔結構 Vue 3 項目通常基于 Vue CLI 或 Vite 等工具創建&#xff0c;其文檔結構如下&#xff1a; 常見目錄結構 my-vue-project/ ├── public/ # 靜態資源目錄 │ ├── index.html # 入口頁面 ├── src/ …

P8662 [藍橋杯 2018 省 AB] 全球變暖--DFS

P8662 [藍橋杯 2018 省 AB] 全球變暖--dfs 題目 解析講下DFS代碼 題目 解析 這道題的思路就是遍歷所有島嶼&#xff0c;判斷每一塊陸地是否會沉沒。對于這種圖的遍歷&#xff0c;我們首先應該想到DFS。 代碼的注意思想就是&#xff0c;在主函數中遍歷找出所有島嶼&#xff0c…

mmseg

系列文章目錄 文章目錄 系列文章目錄bug bug File "/public/home/rsinfo/project/mmsegmentation/mmseg/__init__.py", line 61, in <module>assert (mmcv_min_version < mmcv_version < mmcv_max_version), \ AssertionError: MMCV2.2.0 is used but i…

AI多模態教程:DeepSeek多模態模型解析及實踐指南

AIGCmagic社區知識星球是國內首個以AIGC全棧技術與商業變現為主線的學習交流平臺&#xff0c;涉及AI繪畫、AI視頻、大模型、AI多模態、數字人以及全行業AIGC賦能等100應用方向。星球內部包含海量學習資源、專業問答、前沿資訊、內推招聘、AI課程、AIGC模型、AIGC數據集和源碼等…

【銀河麒麟高級服務器操作系統實例】虛擬機橋接網絡問題分析及處理

更多銀河麒麟操作系統產品及技術討論&#xff0c;歡迎加入銀河麒麟操作系統官方論壇 https://forum.kylinos.cn 了解更多銀河麒麟操作系統全新產品&#xff0c;請點擊訪問 麒麟軟件產品專區&#xff1a;https://product.kylinos.cn 開發者專區&#xff1a;https://developer…

使用騰訊ncnn加速推理yolo v9對比opencv dnn

前面博客 【opencv dnn模塊 示例(25) 目標檢測 object_detection 之 yolov9 介】 紹了 yolov9 詳細使用方式&#xff0c;重參數化、導出端到端模型&#xff0c;使用 torch、opencv、tensorrt 以及 paddle 的測試。 由于存在移動端推理部署的需求&#xff0c;需要進行加速處理&…

前端小食堂 | Day10 - 前端路由の時空裂隙

??? 今日穿梭指南:兩種維度の路由宇宙 1. Hash 模式:錨點の量子隧道 // 手動創建路由監聽器 window.addEventListener(hashchange, () => {const path = location.hash.slice(1) || /; console.log(進入哈希宇宙:, path); renderComponent(path); }); // 編程…

C語言學習筆記-進階(7)字符串函數3

1. strstr的使用和模擬實現 char * strstr ( const char * str1, const char * str2); Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. &#xff08;函數返回字符串str2在字符串str1中第?次出現的位置&#x…

HarmonyOS Next 屬性動畫和轉場動畫

HarmonyOS Next 屬性動畫和轉場動畫 在鴻蒙應用開發中&#xff0c;動畫是提升用戶體驗的關鍵要素。通過巧妙運用動畫&#xff0c;我們能讓應用界面更加生動、交互更加流暢&#xff0c;從而吸引用戶的注意力并增強其使用粘性。鴻蒙系統為開發者提供了豐富且強大的動畫開發能力&…

PHP:phpstudy無法啟動MySQL服務問題解決

文章目錄 一、問題說明二、解決問題 一、問題說明 我的Windows10系統&#xff0c;之前安裝過MySQL5.7的版本。 然后&#xff0c;用phpstudy安裝MySQL8&#xff0c;并啟動MySQL8。 發生無法啟動的情況。 二、解決問題 1、刪除本地MySQL7的服務 net stop MySQL //這里的服務名…

Nginx(基礎安裝+配置文件)

目錄 一.Nginx基礎 1.基礎知識點 2.異步非阻塞機制 二.Nginx安裝 2.1安裝nginx3種方式 1.包管理工具安裝&#xff08;yum/apt&#xff09; 2.本地包安裝&#xff08;rpm/dpkg&#xff09; 3.源碼編譯安裝 3.1 源碼編譯安裝nginx流程&#xff08;ubuntu&#xff09; 1.…

C++ Windows下屏幕截圖

屏幕截圖核心代碼&#xff08;如果要求高幀率&#xff0c;請使用DxGI&#xff09;&#xff1a; // RGB到YUV的轉換公式 #define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) (0.587 * (g)) (0.114 * (b)))) #define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) …

修改jupyter notebook的工作空間

今天&#xff0c;我之前R配置jupyter工作空間&#xff0c;講了各種語言內核分配不同的工作空間&#xff0c;雖然是方便管理&#xff0c;但有個問題就是需要每次都進入C盤的配置文件找到notebook的工作空間設置路徑打開修改嘛。 因此&#xff0c;今天我編寫了一個python腳本&am…

江科大51單片機筆記【9】DS1302時鐘可調時鐘(下)

在寫代碼前&#xff0c;記得把上一節的跳線帽給插回去&#xff0c;不然LCD無法顯示 一.DS1302時鐘 1.編寫DS1302.c文件 &#xff08;1&#xff09;重新對端口定義名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;&#xff08;2&#xff09;初始化 因為…