[GESP202309 六級] 2023年9月GESP C++六級上機題題解,附帶講解視頻!

本文為GESP 2023年9月 六級的上機題目詳細題解和講解視頻,覺得有幫助或者寫的不錯可以點個贊。

題目一講解視頻

GESP2023年9月六級上機題一

題目二講解視頻

題目一:小羊買飲料

B3873 [GESP202309 六級] 小楊買飲料 - 洛谷

題目大意:

現在超市一共有n種飲料,每種飲料有對應的售價c元,和容量l毫升。

現在你每種飲料只能買一瓶,并且最后要買至少L毫升飲料。

請問在這個前提下,最少花多少錢。

解題思路:

很明顯的背包dp。

我們回顧一下原始的01背包問題:

有n個物品,每個物品都有價值v,和重量w,背包容量是C,我們需要在小于等于C的背包容量下獲取最大的價值。

這個題目呢,可以理解成,n個物品,每個物品都有價值c和容量i,我們必須要使得最終背包的容量大于等于L,并且讓價值盡可能少!

經過上述分析,很明顯就能想到以下的思路:

我們令dp[i][v]表示用前i個飲料,恰好湊到v升飲料的最小花費

我們最多可以達到tot = sum(l1,l2,l3,...ln)升飲料

那么對于第i個飲料,可以不

dp[i][j] = dp[i - 1][j]

或者買

令val = 第i個飲料的價值,c = 第i個飲料的容量

dp[i][j] = dp[i - 1][j - val] + c

使得價值最低,也就是

dp[i][j] = min(dp[i][j], dp[i - 1][j - val] + c)

然后呢,最終算的結果是對于前N個飲料,容量大于等于L的時候的最小價值。

也就是我們遍歷j從L 到 mx,計算dp[N][j]的最小值。這個方法即使寫成一維數組也會超內存,因為tot 的最大值為5e8。

我們需要優化一下。

我們可以注意到,只要是大于等于L的部分,都可以理解成是等于L的。

那么也就是我們dp數組實際大小只需要開到L + 1就可以了,實際計算的時候把大于L的部分算成L即可。

實際實現可以是,在遍歷的時候,設置一個當前j可達的一個容量cur,cur = min(L, j + val)

如果dp[i - 1][j]可以達到,那么dp[i][cur] = min(dp[i][cur], dp[i - 1][j] + cost)

代碼(C++):

#include <bits/stdc++.h>using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, L;std::cin >> n >> L;std::vector<int> c(n), l(n);for (int i = 0; i < n; i++) {std::cin >> c[i] >> l[i];}int inf = INT_MAX;std::vector dp(n + 1, std::vector<int> (L + 1, inf));dp[0][0] = 0;for (int i = 1; i <= n; i++) {//整層拷貝,表示不選dp[i] = dp[i - 1];int cost = c[i - 1], val = l[i - 1];for (int j = 0; j <= L; j++) {int cur = std::min(L, j + val);if (dp[i - 1][j] != inf) {dp[i][cur] = std::min(dp[i][cur], dp[i - 1][j] + cost);}}}int ans = dp[n][L];std::cout << (ans == inf ? "no solution" : std::to_string(ans));
}

題目二:小楊的握手問題

B3874 [GESP202309 六級] 小楊的握手問題 - 洛谷

題目大意:

現在有n個學生,編號為0到n -1,現在讓這n個學生按照某個順序進入教室。

當一個同學進入教室后,他需要和所有學號小于他的進行握手。

當所有同學按照某個順序進入教室后,請問總共的握手次數是多少?

解題思路一:歸并排序

這個題目可以抽象為,求一個數組中順序對的個數。

為了方便,我們這里就求逆序對的數量cnt,然后用總對數減去cnt即為答案

下面是歸并排序的原理圖,每次把當前的數組分成一半,然后分到最后的時候進行合并。

我們可以在合并的過程中求逆序對數目,比如說合并7 3,是逆序的,逆序對數目加一

合并2 3 7 16和4 9 11 24,4是小于7的,那么4肯定小于7之后所有的數字。

代碼一(C++):

#include <bits/stdc++.h>using i64 = long long;i64 mSort(std::vector<int>& a, std::vector<int>& tmp, int l, int r) {if (r - l <= 1) {return 0;}i64 cnt = 0;int m = (l + r) / 2;cnt += mSort(a, tmp, l, m);cnt += mSort(a, tmp, m, r);int i = l, j = m, k = l;while (i < m && j < r) {if (a[i] <= a[j]) {tmp[k] = a[i];k++;i++;} else {tmp[k] = a[j];cnt += m - i;j++;k++;}}while (i < m) {tmp[k] = a[i];i++;k++;}while (j < r) {tmp[k] = a[j];j++;k++;}for (int i = l; i < r; i++) {a[i] = tmp[i];}return cnt;
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; i++) {std::cin >> a[i];}std::vector<int> tmp(n);i64 tot = 1LL * n * (n - 1) / 2;i64 cnt = mSort(a, tmp, 0, n);std::cout << tot - cnt << "\n";
}

解題思路二:樹狀數組

我們可以這么理解題目,現在有一個長度為n的數組t, 并且剛開始都為0。

我們可以持續的進行下面這個過程求順序對個數:

現在編號為x同學進入教室

我們可以把t[x]設置成1,并且看x前面有多少個1,前面的肯定是比當前x小的,也就是求前面部分的前綴和!

那么問題抽象成了,每次把x增加1,然后求[0, x - 1]的前綴和。可以用樹狀數組加速處理!

代碼二(C++):

#include <bits/stdc++.h>using i64 = long long;// 模板來源:https://leetcode.cn/circle/discuss/mOr1u6/
// FenwickTree 模板(1-indexed)
template<typename T>
class FenwickTree {std::vector<T> tree;public:// 使用下標 1 到 nFenwickTree(int n) : tree(n + 1) {}// a[i] 增加 val, i 為 1-indexed// 時間復雜度 O(log n)void update(int i, T val) {for (; i < tree.size(); i += i & -i) {tree[i] += val;}}// 求前綴和 a[1] + ... + a[i]// 時間復雜度 O(log n)T pre(int i) const {T res = 0;for (; i > 0; i &= i - 1) {res += tree[i];}return res;}// 求區間和 a[l] + ... + a[r]T query(int l, int r) const {if (r < l) return 0;return pre(r) - pre(l - 1);}
};int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n;std::cin >> n;FenwickTree<int> ft(n);i64 ans = 0;for (int i = 0; i < n; i++) {int id;std::cin >> id;id += 1;ans += ft.pre(id);ft.update(id, 1);}std::cout << ans << "\n";
}

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

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

相關文章

linux 操作ppt

目錄 方法1&#xff1a;用 libreoffice 打開PPT文件 播放腳本&#xff1a; 方法2&#xff1a;用 python-pptx 創建和編輯PPT 方法3&#xff1a;其他方法 在Linux中&#xff0c;可以使用Python通過python-pptx庫來創建和編輯PPT文件&#xff0c;但直接播放PPT文件需要借助其…

元數據管理與數據治理平臺:Apache Atlas 基本搜索 Basic Search

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 Apache Atlas 框架是一套可擴展的核心基礎治理服務&#xff0c;使企業能夠有效、高效地滿足 Hadoop 中的合規性要求&#xff0c;并支持與整個…

LangChain4J-(1)-Hello World

一、LangChain4J是什么&#xff1f; LangChain4J 是一個專為 Java 生態系統設計的開源框架&#xff0c;用于簡化與大語言模型&#xff08;LLM&#xff0c;如 OpenAI 的 GPT 系列、Google 的 Gemini、Anthropic 的 Claude 等&#xff09;的集成和交互。它借鑒了 Python 生態中 L…

HTTPS應用層協議-中間攻擊人

HTTPS應用層協議-中間攻擊人 ? Man-in-the-MiddleAttack&#xff0c;簡稱“MITM 攻擊” 確實&#xff0c;在方案 2/3/4 中&#xff0c;客戶端獲取到公鑰 S 之后&#xff0c;對客戶端形成的對稱秘鑰 X 用服務端給客戶端的公鑰 S 進行加密&#xff0c;中間人即使竊取到了數據&am…

利用 Makefile 高效啟動 VIVADO 軟件:深入解析與實踐

利用 Makefile 高效啟動 VIVADO 軟件&#xff1a;深入解析與實踐 系列文章目錄 1、VMware Workstation Pro安裝指南&#xff1a;詳細步驟與配置選項說明 2、VMware 下 Ubuntu 操作系統下載與安裝指南 3.基于 Ubuntu 的 Linux 系統中 Vivado 2020.1 下載安裝教程 文章目錄利用 …

[前端算法]排序算法

默認情況下&#xff0c;sort() 會將元素轉換為字符串&#xff0c;然后按照 Unicode 編碼的順序進行排序&#xff1a; const fruits [apple, banana, cherry, date]; fruits.sort(); console.log(fruits); // 輸出: ["apple", "banana", "cherry"…

C#標簽批量打印程序開發

C#標簽批量打印程序開發&#xff08;集成Bartender解決方案&#xff09;一、系統架構設計 1. 核心模塊劃分 public class LabelPrintingSystem {private IDataLoader _dataLoader; // 數據加載器private ITemplateEngine _templateEngine; // 模板引擎private IPrintControl…

ECC的原理、背景、工作機制和數學基礎

ECC的原理、背景、工作機制和數學基礎摘要&#xff1a;本文首先詳細介紹ECC&#xff08;Error-Correcting Code&#xff0c;糾錯碼&#xff09;的原理&#xff0c;包括背景、工作機制和數學基礎。然后&#xff0c;解釋ECC在SRAM&#xff08;Static Random-Access Memory&#x…

計算機網絡2-2:物理層下面的傳輸媒體

目錄 導引型傳輸媒體 同軸電纜 雙絞線 光纖 電力線 非導引型傳輸媒體 無線電波 微波 紅外線 可見光 無線電頻譜管理機構 導引型傳輸媒體 同軸電纜 雙絞線 光纖 光在光纖中傳播的基本原理 電力線 非導引型傳輸媒體 無線電波 微波 紅外線 可見光 LiFi(可見光通信) …

Dify 從入門到精通(第 32/100 篇):Dify 的日志分析與監控

Dify 從入門到精通&#xff08;第 32/100 篇&#xff09;&#xff1a;Dify 的日志分析與監控 Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#xff1a…

【IntelliJ IDEA】修改堆內存

idea卡頓&#xff0c;鼠標漂移修改idea文件打開 idea 安裝路徑&#xff0c;【bin】目錄下【idea64.exe.vmoptions】文件修改【-Xms】最小內存【-Xmx】最大內存-Xms2048m -Xmx9216midea更改內存設置工具欄幫助更改內存設置設置堆大小上限為 文件 設置的最大內存保存并重啟Leslie…

Docker與Docker Compose:容器世界的“單兵作戰”與“軍團指揮官”

在容器化技術的浪潮中&#xff0c;Docker和Docker Compose如同“雙子星”&#xff0c;一個專注于單兵作戰&#xff0c;一個擅長軍團指揮。它們看似相似&#xff0c;卻各司其職。對于開發者來說&#xff0c;理解它們的區別不僅能讓代碼部署事半功倍&#xff0c;更能避免踩坑。本…

進階向:Python編寫自動化郵件發送程序

Python編寫自動化郵件發送程序&#xff1a;從零開始詳解在數字化時代&#xff0c;自動化郵件發送功能已成為企業和個人提升工作效率的重要工具。據統計&#xff0c;全球每天發送的商業郵件超過30億封&#xff0c;其中約40%是通過自動化系統發送的。這種功能被廣泛應用于多種場景…

ChatGpt 5系列文章1——編碼與智能體

人工智能技術正在以驚人的速度發展&#xff0c;重新定義著開發人員的工作方式。2025年8月&#xff0c;OpenAI正式發布了面向開發人員的GPT-5 一、GPT-5的編碼能力突破 GPT-5在關鍵編碼基準測試中創造了行業新紀錄(SOTA)&#xff0c;在SWE-bench Verified測試中得分74.9%&…

力扣top100(day02-05)--二叉樹 02

102. 二叉樹的層序遍歷 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

開疆智能Ethernet轉ModbusTCP網關連接發那科機器人與三菱PLC配置案例

本案例是三菱FX5U PLC通過ethernet/IP轉ModbusTCP網關對發那科機器人進行控制的配置案例。PLC端主要配置以太網端口設置在通信測試中&#xff0c;PLC作為主站&#xff0c;在PLC設置中選擇“以太網端口”非常關鍵&#xff0c;以確保通信測試的正常進行。1、首先&#xff0c;在PL…

VUE+SPRINGBOOT從0-1打造前后端-前后臺系統-系統首頁

在現代Web應用開發中&#xff0c;管理后臺是幾乎所有企業級應用不可或缺的部分。一個優秀的后臺首頁不僅需要提供清晰的信息展示&#xff0c;還需要具備良好的用戶體驗和視覺效果。本文將詳細介紹如何使用Vue.js框架配合Element UI組件庫和ECharts圖表庫&#xff0c;構建一個功…

第6節 torch.nn介紹

6.1 torch.nn.Module介紹 torch.nn.Module是 PyTorch 中構建神經網絡的基礎類&#xff0c;所有的神經網絡模塊都應該繼承這個類。它提供了一種便捷的方式來組織和管理網絡中的各個組件&#xff0c;包括層、參數等&#xff0c;同時還內置了許多用于模型訓練和推理的功能。 官網…

python自學筆記7 可視化初步

圖像的組成工具庫 Matplotlib&#xff1a;繪制靜態圖 Plotly: 可以繪制交互式圖片 圖像的繪制&#xff08;Matplotlib&#xff09; 創建圖形&#xff0c;軸對象 創造等差數列 # 包含后端點 arr np.linspace(0, 1, num11) # 不包含后端點 arr_no_endpoint np.linspace(0, 1, n…

GIS 常用的矢量與柵格分析工具

矢量處理工具作用典型應用緩沖區分析Buffer環境影響區域&#xff0c;空間鄰近度分析等&#xff0c;例如道路周圍一公里內的學校&#xff0c;噪音污染影響的范圍裁剪Clip例如使用A市圖層裁剪全國道路數據&#xff0c;獲取A市道路數據交集Intersect識別與LUCC、分區洪水區、基礎設…