[藍橋杯] 挖礦(CC++雙語版)

題目鏈接

? ? ? ? ? P10904 [藍橋杯 2024 省 C] 挖礦 - 洛谷

題目理解

? ? ? ? 我們可以將這道題中礦洞的位置理解成為一個坐標軸,以題目樣例繪出坐標軸:

樣例:

? ? ? ? 輸入的5為礦洞數量,4為可走的步數。第二行輸入是5個礦洞的坐標。輸出結果為在要求步數內最多可采集到的單位數量的礦石。

?????????我們下面來對樣例進行分析:

? ? ? ? 初始狀態如下:

? ? ? ? 初始位置為0,剩余步數為4。當坐標0有礦石時,不需要消耗步數,可直接獲取礦石:

? ? ? ? 我們向-1移動:

????????此時若是向負軸移動,我們只能采到1個單位的礦石,正軸方向可以采到2個單位。于是我們向正軸方向進發:

? ? ? ? 繼續進發:

????????繼續:

?

解題思路

? ? ??——(篇幅較長,大家也可以先看詳細注釋后的代碼,遇到不懂的地方再看解題思路)——

? ?一、核心思路概述

????????解決該挖礦問題的核心在于合理利用數軸上礦洞的分布信息以及移動距離限制,通過巧妙的統計和計算,找出在給定移動距離內能夠挖掘到最多礦石的方法。主要步驟包括對礦洞坐標的分類統計、構建前綴和數組以快速計算區間礦洞數量,以及全面考慮不同移動策略下的礦石獲取情況。

? ?二、具體步驟解析

? ? (一)輸入數據處理

1. 讀取礦洞數量 n 和最大移動距離 m,這兩個參數將決定后續計算的范圍和約束條件。

2. 依次讀取 n 個礦洞在數軸上的坐標值,對于每個坐標值進行如下分類處理:

  • ????????如果坐標值為 0,說明該礦洞位于小藍的起始位置,直接將此類礦洞的計數變量 s 加 1。這些礦洞無需移動即可挖掘,對最終結果有直接貢獻。
  • ????????如果坐標值不為 0,且其絕對值小于等于 m,則根據坐標值的正負性分別處理。
  • ????????若坐標值為負數,將其對應在負半軸的位置索引處的計數器(例如數組 l)加 1,用于統計負半軸上在移動距離范圍內的礦洞數量。
  • ????????若坐標值為正數,將其對應在正半軸的位置索引處的計數器(例如數組 r)加 1,用于統計正半軸上在移動距離范圍內的礦洞數量。

? (二)構建前綴和數組

????????1. 對于記錄負半軸礦洞數量的數組 l,從索引 1 開始到 m,依次計算前綴和。即 l[i] = l[i - 1] + l[i],這樣 l[i] 就表示數軸負半軸上從 -1 到 -i 位置的礦洞總數。通過前綴和,我們可以在后續計算中快速得到負半軸某一區間內的礦洞數量。

????????2. 同理,對于記錄正半軸礦洞數量的數組 r,也從索引 1 開始到 m,計算前綴和 r[i] = r[i - 1] + r[i],使得 r[i] 表示數軸正半軸上從 1 到 i 位置的礦洞總數。

? (三)計算最大礦石獲取量

1. 初始假設:

  • ????????首先假設最大礦石獲取量 ans 為只在正半軸或只在負半軸移動時能夠挖掘到的最大礦石數。即 ans = max(r[m], l[m]),這是一種簡單的初步情況考慮,因為在某些情況下,僅在一個方向移動可能就能夠獲取最多的礦石。

2. 考慮混合移動策略:

  • ????????通過循環遍歷 i 從 1 到 m / 2(因為左右移動距離之和不能超過 m,所以 i 最大取到 m / 2),嘗試不同的左右移動組合。 - 對于每一個 i 值,計算兩種混合移動策略下能夠挖掘到的礦石數:
  • ????????先向右移動 i 單位距離,再向左移動 m - 2 * i 單位距離時,能夠挖掘到的礦石數為 sr = r[i] + l[m - 2 * i]。這里 r[i] 表示向右移動 i 單位距離過程中挖掘到的正半軸礦洞數,l[m - 2 * i] 表示向左移動 m - 2 * i 單位距離過程中挖掘到的負半軸礦洞數。 - 先向左移動 i 單位距離,再向右移動 m - 2 * i 單位距離時,能夠挖掘到的礦石數為 sl = l[i] + r[m - 2 * i]。這里 l[i] 表示向左移動 i 單位距離過程中挖掘到的負半軸礦洞數,r[m - 2 * i] 表示向右移動 m - 2 * i 單位距離過程中挖掘到的正半軸礦洞數。
  • ????????每次計算出 sr 和 sl 后,更新最大礦石獲取量 ans,即 ans = max(ans, sr, sl),取當前的 ans、sr 和 sl 中的最大值作為新的 ans。

3. 加上起始點礦洞數量:

  • ????????最后,將起始點(坐標為 0)的礦洞數量 s 加到 ans 中,因為這些礦洞在初始位置就可獲取,無需移動。此時得到的 ans 即為在移動距離不超過 m 的前提下,小藍最多能獲得的礦石單位數量。 通過以上步驟,我們可以全面且高效地解決在給定條件下的挖礦問題,找到獲取最多礦石的方案。

完整代碼(詳細注釋)

? ? ? ? 本文由于用到了std庫中的一些函數,所以作者最開始采用了C++,C語言代碼作者用ai轉化并確保代碼無誤后給大家放在了下面。

????1.C++代碼

#include <bits/stdc++.h>// 定義 solve 函數來解決挖礦問題
void solve() 
{int n, m;// 從標準輸入讀取礦洞數量 n 和最大移動距離 mstd::cin >> n >> m;// s 用于記錄坐標為 0 的礦洞數量int s = 0;// 定義兩個靜態數組 l 和 r 來分別記錄負半軸和正半軸礦洞的前綴和// 數組大小為 m + 1,初始化為 0int l[10000001] = {0};int r[10000001] = {0};// 遍歷每個礦洞for (int i = 0; i < n; ++i) {int x;// 讀取當前礦洞的坐標std::cin >> x;// 如果礦洞坐標的絕對值小于等于最大移動距離 m 且為負數//abs為絕對值函數if (std::abs(x) <= m && x < 0){// 對應負半軸的位置計數加 1l[-x]++;}// 如果礦洞坐標的絕對值小于等于最大移動距離 m 且為正數else if (std::abs(x) <= m && x > 0) {// 對應正半軸的位置計數加 1r[x]++;}// 如果礦洞坐標為 0else if (x == 0) {// 坐標為 0 的礦洞數量加 1s++;}}// 計算負半軸礦洞的前綴和for (int i = 1; i <= m; ++i){l[i] += l[i - 1];}// 計算正半軸礦洞的前綴和for (int i = 1; i <= m; ++i) {r[i] += r[i - 1];}// 先假設最大礦石數為只走正半軸或只走負半軸能挖到的最大礦石數int ans = std::max(r[m], l[m]);// 嘗試不同的左右移動組合,i 表示先向一個方向移動的距離for (int i = 1; i <= m / 2; ++i) {// 先向右移動 i 的距離,再向左移動 m - i * 2 的距離能挖到的礦石數int sr = r[i] + l[m - i * 2];// 先向左移動 i 的距離,再向右移動 m - i * 2 的距離能挖到的礦石數int sl = l[i] + r[m - i * 2];// 更新最大礦石數ans = std::max({ans, sr, sl});}// 加上坐標為 0 的礦洞數量ans += s;// 輸出最大能獲得的礦石數std::cout << ans << '\n';
}int main() 
{solve();return 0;
}

?????2.C語言代碼?

#include <stdio.h>
#include <math.h>#define MAX_M 10000001// 定義 solve 函數來解決挖礦問題
void solve() {int n, m;// 從標準輸入讀取礦洞數量 n 和最大移動距離 mscanf("%d %d", &n, &m);// s 用于記錄坐標為 0 的礦洞數量int s = 0;// 定義兩個靜態數組 l 和 r 來分別記錄負半軸和正半軸礦洞的前綴和// 數組大小為 MAX_M,初始化為 0int l[MAX_M] = {0};int r[MAX_M] = {0};// 遍歷每個礦洞for (int i = 0; i < n; ++i) {int x;// 讀取當前礦洞的坐標scanf("%d", &x);// 如果礦洞坐標的絕對值小于等于最大移動距離 m 且為負數if (abs(x) <= m && x < 0) {// 對應負半軸的位置計數加 1l[-x]++;}// 如果礦洞坐標的絕對值小于等于最大移動距離 m 且為正數else if (abs(x) <= m && x > 0) {// 對應正半軸的位置計數加 1r[x]++;}// 如果礦洞坐標為 0else if (x == 0) {// 坐標為 0 的礦洞數量加 1s++;}}// 計算負半軸礦洞的前綴和for (int i = 1; i <= m; ++i) {l[i] += l[i - 1];}// 計算正半軸礦洞的前綴和for (int i = 1; i <= m; ++i) {r[i] += r[i - 1];}// 先假設最大礦石數為只走正半軸或只走負半軸能挖到的最大礦石數int ans = (r[m] > l[m]) ? r[m] : l[m];// 嘗試不同的左右移動組合,i 表示先向一個方向移動的距離for (int i = 1; i <= m / 2; ++i) {// 先向右移動 i 的距離,再向左移動 m - i * 2 的距離能挖到的礦石數int sr = r[i] + l[m - i * 2];// 先向左移動 i 的距離,再向右移動 m - i * 2 的距離能挖到的礦石數int sl = l[i] + r[m - i * 2];// 更新最大礦石數if (sr > ans) ans = sr;if (sl > ans) ans = sl;}// 加上坐標為 0 的礦洞數量ans += s;// 輸出最大能獲得的礦石數printf("%d\n", ans);
}int main() {solve();return 0;
}

???????AC拿下!

疑難解答?

? ? 1.max函數的運用

? ? ? ? 用于比較出幾個數中最大的數字,大家可以簡單理解為兩個數比較就不需要大括號,如果三個及以上的話需要大括號。

  • 兩個參數比較:當比較兩個值時,使用?std::max(a, b)?形式,這里?a?和?b?是要比較的對象,不需要大括號。比如?int num1 = 5, num2 = 3; int maxNum = std::max(num1, num2);?。
  • 三個及以上參數比較:對于三個或更多值,常使用接收初始化列表形式的重載,即?std::max({val1, val2, val3,...})?,需要用大括號把這些值組成初始化列表傳遞給函數。像?int num1 = 1, num2 = 2, num3 = 3; int maxNum = std::max({num1, num2, num3});?。

———(如有問題,歡迎評論區提問)———

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

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

相關文章

2025年Python的主要應用場景

李升偉 編譯 Python在2025年仍是最受歡迎和強大的編程語言之一。其簡潔易讀的語法以及龐大的庫生態系統&#xff0c;使其成為各行業開發者的首選。無論是構建復雜的數據管道&#xff0c;還是自動化重復性任務&#xff0c;Python都能提供廣泛的應用場景&#xff0c;以實現快速、…

fastapi完全離線環境(無外網)的訪問Swagger所做特殊處理

在互聯網環境中&#xff0c;只要 啟動FastAPI 服務運行在本地機器上&#xff0c;訪問 http://localhost:8000/docs&#xff08;Swagger UI&#xff09;就可以訪問到Swagger界面&#xff0c;但是在完全離線環境&#xff08;無外網&#xff09;下如何訪問Swagger頁面呢&#xff1…

Ubuntu 20.04 出現問號圖標且無法聯網 修復

在 Ubuntu 中遇到網絡連接問題&#xff08;如出現問號圖標且無法聯網&#xff09;&#xff0c;可以通過以下命令嘗試重啟網絡服務&#xff1a; 1. 推薦先修改DNS 編輯 -> 虛擬機網絡編輯器-> VMnet8 ->NAT 設置 -> DNS 設置 -> 設置DNS 服務器 DNS填什么 取決…

哈希表(開散列)的實現

目錄 引入 開散列的底層實現 哈希表的定義 哈希表的擴容 哈希表的插入 哈希表查找 哈希表的刪除 引入 接上一篇&#xff0c;我們使用了閉散列的方法解決了哈希沖突&#xff0c;此篇文章將會使用開散列的方式解決哈希沖突&#xff0c;后面對unordered_set和unordered_map的…

機器學習(八):K-Means聚類原理與實戰

聲明&#xff1a;未經允許禁止轉載與抄襲。 前言 k k k均值&#xff08; k k k-means&#xff09;聚類算法是一種經典的無監督聚類算法&#xff0c;本文將深入解析其理論原理&#xff0c;并在真是數據集上進行算法實踐&#xff0c;話不多說&#xff0c;請看下文。 算法原理 …

判斷矩陣A和矩陣B是否相似?

【例題1】 &#xff08;1&#xff09;方法1 &#xff08;2&#xff09;方法2 &#xff08;3&#xff09;方法3 好題\(^o^)/~ 【注意】當二次多項式有重根時&#xff0c;即判別式為零&#xff0c;此時二次多項式是完全平方。

【10】搭建k8s集群系列(二進制部署)之安裝Dashboard和CoreDNS

一、部署Dashboard 1.1、創建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下&#xff1a; # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …

大數據技術與Scala

集合高級函數 過濾 通過條件篩選集合元素&#xff0c;返回新集合。 映射 對每個元素應用函數&#xff0c;生成新集集合 扁平化 將嵌套集合展平為單層集合。 扁平化映射 先映射后展平&#xff0c;常用于拆分字符串。 分組 按規則將元素分組為Map結構。 歸約 …

數據驅動可視化實戰:圖表狐精準生成圖表的完整數據范式

一、數據輸入黃金法則 圖表狐 - AI圖表生成工具,在線數據可視化要求數據描述必須包含三個核心要素&#xff1a; [主體對象] [量化指標] [維度劃分] 錯誤示例 ?&#xff1a; "展示各部門銷售額對比" 正確示例 ?&#xff1a; "2023年Q1-Q4各部門銷售額&a…

蒼穹外賣(1)-部分環境配置(git、數據庫)

首先配置git 創建好本地倉庫之后 把項目弄到遠程倉庫里去 先進行提交 &#xff0c;后進行推送 &#xff0c;然后gitee創建一個倉庫 把這個url復制好 推送后會出來一個 點擊推送&#xff0c;會讓你輸入gitee賬號密碼&#xff0c;輸入自己的賬號密碼&#xff0c;就可以連接遠程倉…

Ubunut18.04 離線安裝MySQL 5.7.35

一、環境準備 1.1 官方下載MySQL5.7.35 完整包 1.2 上傳包 & 解壓 上傳包名稱是&#xff1a;mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切換到上傳目錄 cd /home/MySQL # 解壓&#xff1a; tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…

Linux(CentOS10) gcc編譯

本例子摘自《鳥哥的linux私房菜-基礎學習第四版》 21.3 用make進行宏編譯 書中的代碼在本機器(版本見下&#xff09;編譯出錯&#xff0c;改正代碼后發布此文章&#xff1a; #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…

MCP+Blender創建電力塔

MCP&#xff08;Model Context Protocol&#xff09;與Blender的結合是當前AI與3D建模領域的熱門技術&#xff0c;它通過協議化的方式讓Claude等AI模型直接控制Blender&#xff0c;實現自動化3D建模。 1. 功能與原理 ? 核心能力&#xff1a;用戶通過自然語言指令&#xff08;…

Qt與C++數據類型轉換

本文深入探討Qt與C中相似但不同的數據類型處理技巧。 一、QString與std::string的相互轉換 1. QString → std::string 方法1&#xff1a;使用toStdString()&#xff08;推薦&#xff09; QString qstr "你好&#xff0c;Qt世界"; std::string str qstr.toStdS…

機器學習+EEG熵進行雙相情感障礙診斷的綜合評估

摘要 雙相情感障礙(BD)是一種常見的精神疾病&#xff0c;特點是躁狂或輕躁狂與抑郁交替發作&#xff0c;其嚴重程度各異&#xff0c;導致準確及時的診斷具有一定的挑戰性。EEG的非線性特征被認為是精神障礙的生物標志物&#xff0c;能夠反映大腦的非線性動態。盡管已有研究證明…

企業應用集成全析:架構、實踐與展望

企業應用集成全析&#xff1a;架構、實踐與展望 一、企業應用集成的基本概念1.1 定義1.2 目標 二、企業應用集成的層次架構2.1 數據集成2.2 應用系統集成2.3 業務流程集成? 三、企業應用集成的關鍵技術3.1 中間件技術3.2 Web 服務技術?3.3 企業服務總線&#xff08;ESB&#…

【STL】list介紹(附與vector的比較)

文章目錄 1.關于list2.使用2.1 list的構造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素訪問2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…

【Django】教程-12-柱狀圖

【Django】教程-1-安裝創建項目目錄結構介紹 【Django】教程-2-前端-目錄結構介紹 【Django】教程-3-數據庫相關介紹 【Django】教程-4-一個增刪改查的Demo 【Django】教程-5-ModelForm增刪改查規則校驗【正則鉤子函數】 【Django】教程-6-搜索框-條件查詢前后端 【Django】教程…

SQL:DDL(數據定義語言)和DML(數據操作語言)

目錄 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;數據定義語言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;數據操作語言&#xff09; DDL和DML的區別 什么是SQL&#xff1f; SQL&#xff08;Structured …

Chrome 135 版本開發者工具(DevTools)更新內容

Chrome 135 版本開發者工具&#xff08;DevTools&#xff09;更新內容 一、性能&#xff08;Performance&#xff09;面板改進 1. 性能面板中的配置文件和函數調用現已顯示來源和腳本鏈接 Performance > Summary&#xff08;性能 > 概覽&#xff09;選項卡現在會顯示配…