【C++題解】貪心和模擬

4小時編碼練習計劃,專注于貪心算法和復雜模擬題,旨在鍛煉您的算法思維、代碼實現能力和耐心。

下午 (4小時): 貪心思維與代碼實現力

今天的重點是兩種在算法競賽和工程中都至關重要的能力:貪心選擇復雜邏輯的精確實現。貪心算法考察的是能否洞察問題的本質,做出局部最優決策;而復雜模擬題則考驗代碼的組織能力、細節處理和調試耐心,這同樣是CCF認證考試中的高頻考點。

練習計劃概覽

  • 總時長:?約 4 小時

  • 核心目標:

    1. 理解貪心算法的本質:在每一步選擇中都采取當前狀態下最好或最優的選擇,從而希望導致全局結果最好或最優。

    2. 學習并實踐經典的貪心模型,如區間調度問題。

    3. 挑戰一道需求復雜、規則繁多的CCF真題,鍛煉將大段文字描述轉化為精確代碼邏輯的能力。

    4. 提升代碼調試能力和處理繁雜邏輯時的耐心與細致度。


第一部分:貪心算法——洞察局部最優解 (約 1.5 小時)

貪心算法的核心在于“貪”。它不從整體最優上加以考慮,所做的選擇只是在某種意義上的局部最優解。關鍵在于,你需要判斷并證明這種局部最優選擇能否導向全局最優。

題目編號題目名稱核心知識點練習目標
P1803凌亂的yyy / 線段覆蓋貪心,?排序,?區間問題經典必做題。這是最經典的貪心問題之一:活動選擇問題。學習如何通過對區間的某個關鍵屬性(如結束時間)進行排序,然后進行貪心選擇,以達成覆蓋最多線段(或安排最多活動)的目標。
CCF202303-2墾田計劃貪心,?二分答案在有限資源下,如何分配資源以最小化總體耗時。這是一個“二分答案 + 貪心驗證”的經典模型。貪心體現在:當我們確定一個目標天數后,總是優先在“性價比”最高(縮短一天耗費資源最少)的田地上投入資源。
題解
//P1803-先處理數據,然后貪心計算。#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main(){int n;cin >> n;int now = 0;int cnt = 0;vector<pair<int,int>> v;    while(n--){int start,end;cin >> start >> end;v.push_back(make_pair(start,end));}sort(v.begin(),v.end(),[](auto a,auto b){return a.second < b.second;});for(auto p : v){if(p.first>=now){now = p.second;cnt++;}}cout << cnt;return 0;
}
//29-2 使用二分限定范圍,然后用貪心判斷這個各個情況下的可行性和結果#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n, m, k;cin >> n >> m >> k;vector<pair<int, int>> areas(n); // {time, cost}for(int i = 0; i < n; i++){cin >> areas[i].first >> areas[i].second; // time, cost}// 二分查找最優答案int left = k, right = 0;for(int i = 0; i < n; i++){right = max(right, areas[i].first);}while(left < right){int mid = (left + right) / 2;long long need = 0;// 計算達到mid天數需要的總資源for(int i = 0; i < n; i++){if(areas[i].first > mid){need += (long long)(areas[i].first - mid) * areas[i].second;}}if(need <= m){right = mid;} else {left = mid + 1;}}cout << left << endl;return 0;
}

練習建議:

  • P1803: 解決此題的關鍵在于想清楚應該按什么標準進行排序。按開始時間?按區間長度?還是按結束時間?嘗試思考不同排序策略的優劣,并理解為什么“按結束時間升序排序”是正確的貪心策略。

  • CCF202303-2: 這類問題直接貪心不好做,但可以思考:如果我猜最終答案是?T?天,我能否用現有的?m?個資源實現這個目標?這個“能否實現”的子問題就可以用貪心來快速判斷。這是一種非常重要的思想。


第二部分:復雜模擬——代碼實現的試金石 (約 2 小時)

這類題目通常沒有復雜的算法,但規則繁多、細節量大,極其考驗代碼的組織能力、細心程度和調試能力。在CCF認證中,這類題目通常是區分選手代碼硬實力的關鍵。

(請從以下兩題中精選一題進行攻克)

題目編號題目名稱核心知識點練習目標
選項A:
CCF202305-3
解壓縮字符串處理,?位運算,?模擬完美復刻您提到的“耐心編碼實現”目標。需要嚴格按照題目給定的、包含多種情況的壓縮格式進行字節流解析。這道題將極大地鍛煉您對題意的精確理解和代碼的嚴謹性。
選項B:
CCF202303-3
LDAP字符串解析,?遞歸/棧,?模擬類似于“JSON查詢”,本題需要解析一種帶有邏輯與/或的嵌套查詢語言。您需要設計數據結構來存儲用戶信息,并使用遞歸或棧來解析查詢表達式,是練習復雜邏輯和數據處理的絕佳選擇.
題解
//30-3 重難點就在理解那三四版的內容,然后轉化成代碼,注意邊界處理,實則主要是耗時和注意力。#include <iostream>
#include <cstdio>
#include <string>using namespace std;
typedef long long LL;
const int N = 5e6 + 10;char str[N], ret[N];
int s, cnt, i;int tran(string str, int t) { // t進制轉十進制int ret = 0;for (int i = 0; i < str.size(); i++) {if (isdigit(str[i])) ret = ret * t + str[i] - '0';else ret = ret * t + str[i] - 'a' + 10;}return ret;
}string twostr(char c1, char c2) { // 16進制轉2進制string ret = "00000000";int a = isdigit(c1) ? c1 - '0' : c1 - 'a' + 10, b = isdigit(c2) ? c2 - '0' : c2 - 'a' + 10; // 改為數字for (int i = 3; i >= 0 && a; i--) { // 前四位ret[i] = a % 2 + '0';a /= 2;}for (int i = 7; i >= 4 && b; i--) { // 后四位ret[i] = b % 2 + '0';b /= 2;}return ret;
}int main() {cin >> s;for (int i = 0; i < (s - 1) / 8 + 1; i++) scanf("%s", str + i * 16);for (i = 0; i < s * 2; i += 2) { // 引導域string ss; ss += str[i]; ss += str[i + 1];if (tran(ss, 16) < 128) break; // 最高位為0,退出}for (i += 2; i < s * 2; i += 2) {string ss = twostr(str[i], str[i + 1]);if (ss[6] == '0' && ss[7] == '0') { // 字面量int le = tran(ss.substr(0, 6), 2), p, ct; // 獲取字面量長度-1的值if (le >= 60) { // le+1>=61int dx = le - 59; // 存儲字面量長度的字節數string lee;for (p = i + dx * 2; p > i; p -= 2) { // 小端序拼接lee += str[p]; lee += str[p + 1];}le = tran(lee, 16); // 獲取字面量長度-1的值i += dx * 2;}for (p = i + 2, ct = 0; ct < le + 1; p += 2, ct++) { // 存儲字面量字節ret[cnt++] = str[p];ret[cnt++] = str[p + 1];}i = p - 2;}else { // 回溯引用int l, o;if (ss[6] == '0' && ss[7] == '1') { // 01形式l = tran(ss.substr(3, 3), 2) + 4;ss = ss.substr(0, 3); ss += twostr(str[i + 2], str[i + 3]);i += 2;o = tran(ss, 2);}else { // 10形式l = tran(ss.substr(0, 6), 2) + 1;ss.clear(); ss += str[i + 4]; ss += str[i + 5]; ss += str[i + 2]; ss += str[i + 3];i += 4;o = tran(ss, 16);}int pcnt = cnt / 2; // 存一下現在的字節數for (int p = 2 * (pcnt - o), ct = 0; ct < l; p += 2, ct++) { // 從第pcnt-o個字節開始,輸出l個字節if (o < l && p == 2 * pcnt) p = 2 * (pcnt - o); // 如果o<l,且到了末尾,回到起點,反復輸出ret[cnt++] = ret[p];ret[cnt++] = ret[p + 1];}}}for (int i = 0; i < cnt; i++) {if (i && i % 16 == 0) cout << endl;cout << ret[i];}return 0;
}

練習建議:

  • 先規劃再動手: 在寫代碼之前,花15-20分鐘仔細閱讀題目,用紙筆把所有規則、分支和狀態轉移想清楚。可以為不同的功能模塊設計獨立的函數(如“解析一個元素”、“處理一次查詢”),讓主邏輯更清晰。

  • 分步驗證: 不要試圖一次性寫完所有代碼。可以先實現最核心、最簡單的部分(例如,只處理一種類型的元素或一種查詢),驗證無誤后,再逐步添加其他復雜情況。

  • 利用樣例: 充分利用題目給出的樣例,一步步手動模擬程序執行過程,對比自己的輸出和預期輸出,可以幫助快速定位邏輯錯誤。


目標達成自查 (約 0.5 小時)

完成以上練習后,進行復盤和總結:

  1. 關于貪心算法:

    • 我解決貪心問題的一般思路是什么?(例如:排序 -> 循環 -> 按規則選擇)

    • 墾田計劃?這道題,為什么不能直接貪心,而要結合二分?(因為貪心的“性價比”會隨著目標天數的改變而改變,沒有一個固定的貪心標準)

  2. 關于復雜模擬:

    • 在處理?解壓縮?或?LDAP?時,我遇到了哪些困難?(例如:邊界條件、狀態管理、字符串處理的細節)

    • 我是如何組織我的代碼來避免邏輯混亂的?(例如:使用結構體、類、輔助函數)

    • 如果再做一次,哪些地方可以改進,從而更快更準確地完成編碼?

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

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

相關文章

JS多行文本溢出處理

在網頁開發中&#xff0c;多行文本溢出是常見的界面問題。當文本內容超出容器限定的高度和寬度時&#xff0c;若不做處理會破壞頁面布局的整潔性&#xff0c;影響用戶體驗。本文將詳細介紹兩種主流的多行文本溢出解決方案&#xff0c;并從多個維度進行對比&#xff0c;幫助開發…

C++(Qt)軟件調試---bug排查記錄(36)

C(Qt)軟件調試—bug排查記錄&#xff08;36&#xff09; 文章目錄C(Qt)軟件調試---bug排查記錄&#xff08;36&#xff09;[toc]1 無返回值函數風險2 空指針調用隱患3 Debug/Release差異4 ARM架構char符號問題5 linux下找不到動態庫更多精彩內容&#x1f449;內容導航 &#x1…

人工智能領域、圖歐科技、IMYAI智能助手2025年8月更新月報

IMYAI 平臺 2025 年 8 月功能更新與模型上新匯總 2025年08月31日 功能更新&#xff1a; 對話與繪畫板塊現已支持多文件批量上傳。用戶可通過點擊或拖拽方式一次性上傳多個圖片或文件&#xff0c;操作更加便捷。2025年08月25日近期更新亮點&#xff1a; 文檔導出功能增強&#x…

2025獨立站技術風向:無頭電商+PWA架構實戰指南

根據 Gitnux 的統計數據&#xff0c;預計到 2025 年&#xff0c;北美將有 60% 的大型零售商采用無頭平臺。而仍在傳統架構上運營的獨立站&#xff0c;平均頁面加載速度落后1.8秒&#xff0c;轉化率低32%。無獨有偶&#xff0c;Magento Association 的一項調查顯示&#xff0c;7…

淘寶京東拼多多爬蟲實戰:反爬對抗、避坑技巧與數據安全要點

一、先搞懂&#xff1a;電商爬蟲的 3 大核心挑戰&#xff08;比普通爬蟲更復雜的原因&#xff09; 做電商爬蟲前&#xff0c;必須先明確「為什么難」—— 淘寶、京東、拼多多的反爬體系是「多層級、動態化、行為導向」的&#xff0c;絕非簡單的 UA 驗證或 IP 封禁&#xff1a;…

【1】MOS管的結構及其工作原理

以nmos舉例&#xff0c;mos管由三個電極&#xff1a;G極&#xff08;gate&#xff09;、D極&#xff08;drain&#xff09;、S極&#xff08;source&#xff09;和一個襯底組成&#xff0c;而這三個電極之間通過絕緣層相隔開&#xff1b;①既然GDS三個電極之間兩兩相互絕緣&…

如何保存訓練的最優模型和使用最優模型文件

一 保存最優模型主要就是我們在for循環中加上一個test測試&#xff0c;并且我還在test函數后面加上了返回值&#xff0c;可以返回準確率&#xff0c;然后每次進行一次對比&#xff0c;然后取大的。然后這里有兩種保存方式&#xff0c;一種是保存了整個模型&#xff0c;另一個是…

vue3+ts+echarts多Y軸折線圖

因為放在了子組件才監聽&#xff0c;加載渲染調用&#xff0c;有暗黑模式才調用&#xff0c;<!-- 溫濕度傳感器 --><el-row v-if"deviceTypeId 2"><el-col :xs"24" :sm"24" :md"24" :lg"24" :xl"24&qu…

基于Taro4打造的一款最新版微信小程序、H5的多端開發簡單模板

基于Taro4、Vue3、TypeScript、Webpack5打造的一款最新版微信小程序、H5的多端開發簡單模板 特色 &#x1f6e0;? Taro4, Vue 3, Webpack5, pnpm10 &#x1f4aa; TypeScript 全新類型系統支持 &#x1f34d; 使用 Pinia 的狀態管理 &#x1f3a8; Tailwindcss4 - 目前最流…

ITU-R P.372 無線電噪聲預測庫調用方法

代碼功能概述&#xff08;ITURNoise.c&#xff09;該代碼是一個 ITU-R P.372 無線電噪聲預測 的計算程序&#xff0c;能夠基于 月份、時間、頻率、地理位置、人為噪聲水平 計算特定地點的 大氣噪聲、銀河噪聲、人為噪聲及其總和&#xff0c;并以 CSV 或標準輸出 方式提供結果。…

《從報錯到運行:STM32G4 工程在 Keil 中的頭文件配置與調試實戰》

《從報錯到運行&#xff1a;STM32G4 工程在 Keil 中的頭文件配置與調試實戰》文章提綱一、引言? 闡述 STM32G4 在嵌入式領域的應用價值&#xff0c;說明 Keil 是開發 STM32G4 工程的常用工具? 指出頭文件配置是 STM32G4 工程在 Keil 中開發的關鍵基礎環節&#xff0c;且…

Spring 事務提交成功后執行額外邏輯

1. 場景與要解決的問題在業務代碼里&#xff0c;常見訴求是&#xff1a;只有當數據庫事務真正提交成功后&#xff0c;才去執行某些“后置動作”&#xff0c;例如&#xff1a;發送 MQ、推送消息、寫審計/埋點日志、刷新緩存、通知外部系統等。如果這些動作在事務提交前就執行&am…

Clickhouse MCP@Mac+Cherry Studio部署與調試

一、需求背景 已經部署測試了Mysql、Drois的MCP Server,想進一步測試Clickhouse MCP的表現。 二、環境 1)操作系統 MacOS+Apple芯片 2)Clickhouse v25.7.6.21-stable、Clickhouse MCP 0.1.11 3)工具Cherry Studio 1.5.7、Docker Desktop 4.43.2(199162) 4)Python 3.1…

Java Serializable 接口:明明就一個空的接口嘛

對于 Java 的序列化,我之前一直停留在最淺層次的認知上——把那個要序列化的類實現 Serializbale 接口就可以了嘛。 我似乎不愿意做更深入的研究,因為會用就行了嘛。 但隨著時間的推移,見到 Serializbale 的次數越來越多,我便對它產生了濃厚的興趣。是時候花點時間研究研…

野火STM32Modbus主機讀取寄存器/線圈失敗(三)-嘗試將存貯事件的地方改成數組(非必要解決方案)(附源碼)

背景 盡管crc校驗正確了&#xff0c;也成功發送了EV_MASTER_EXECUTE事件&#xff0c;但是eMBMasterPoll( void )中總是接收的事件是EV_MASTER_FRAME_RECEIVED或者EV_MASTER_FRAME_SENT&#xff0c;一次都沒有執行EV_MASTER_EXECUTE。EV_MASTER_EXECUTE事件被別的事件給覆蓋了&…

微信小程序校園助手程序(源碼+文檔)

源碼題目&#xff1a;微信小程序校園助手程序&#xff08;源碼文檔&#xff09;?? 文末聯系獲取&#xff08;含源碼、技術文檔&#xff09;博主簡介&#xff1a;10年高級軟件工程師、JAVA技術指導員、Python講師、文章撰寫修改專家、Springboot高級&#xff0c;歡迎高校老師、…

59-python中的類和對象、構造方法

1. 認識一下對象 世間萬物皆是"對象" student_1{ "姓名":"小樸", "愛好":"唱、跳、主持" ......... }白紙填寫太落伍了 設計表格填寫先進一些些 終極目標是程序使用對象去組織數據程序中設計表格&#xff0c;我們稱為 設計類…

向成電子驚艷亮相2025物聯網展,攜工控主板等系列產品引領智造新風向

2025年8月27-29日&#xff0c;IOTE 2025 第二十四屆國際物聯網展深圳站在深圳國際會展中心&#xff08;寶安&#xff09;盛大啟幕&#xff01;作為全球規模領先的物聯網盛會之一&#xff0c;本屆展會以“生態智能&#xff0c;物聯全球”為核心&#xff0c;匯聚超1000家全球頭部…

陣列信號處理之均勻面陣波束合成方向圖的繪制與特點解讀

陣列信號處理之均勻面陣波束合成方向圖的繪制與特點解讀 文章目錄前言一、方向圖函數二、方向圖繪制三、副瓣電平四、陣元個數對主瓣寬度的影響五、陣元間距對主瓣寬度的影響六、MATLAB源代碼總結前言 \;\;\;\;\;均勻面陣&#xff08;Uniform Planar Array&#xff0c;UPA&…

算法在前端框架中的集成

引言 算法是前端開發中提升性能和用戶體驗的重要工具。隨著 Web 應用復雜性的增加&#xff0c;現代前端框架如 React、Vue 和 Angular 提供了強大的工具集&#xff0c;使得將算法與框架特性&#xff08;如狀態管理、虛擬 DOM 和組件化&#xff09;無縫集成成為可能。從排序算法…