每日c/c++題 備戰藍橋杯(修理牛棚 Barn Repair)

修理牛棚 Barn Repair 題解

問題背景與挑戰

在一個暴風雨交加的夜晚,Farmer John 的牛棚遭受了嚴重的破壞。屋頂被掀飛,大門也不翼而飛。幸運的是,許多牛正在度假,牛棚并未住滿。然而,為了保護那些還在牛棚里的牛,Farmer John 必須盡快用木板修復牛棚。但是,他的木材供應商是一個吝嗇鬼,只能提供有限數量的木板。為了避免浪費資源,Farmer John 希望以最少的木板總長度覆蓋所有有牛的牛棚。這是一個典型的優化問題,我們需要在資源有限的情況下,找到最優的解決方案。

輸入輸出格式詳解

輸入

輸入數據包含兩部分:

  • 第一行包含三個整數 msc,分別表示木板的最大數目、牛棚的總數以及牛的總數。
  • 接下來 c 行,每行包含一個整數,表示牛所在的牛棚編號。

輸出

輸出一個整數,表示覆蓋所有有牛的牛棚所需的最小木板總長度。

問題分析與思路探索

這道題是一個典型的區間覆蓋問題。我們需要用有限的木板覆蓋所有有牛的牛棚,同時使木板的總長度最小。這就好比在一條數軸上,有若干個點(牛棚編號),我們的任務是選擇若干個區間(木板的覆蓋范圍),使這些區間的總長度最短。

我最初的想法是直接暴力枚舉所有可能的覆蓋方式,但很快意識到這種方法的局限性。隨著牛棚數量和木板數量的增加,暴力搜索的時間復雜度呈指數級增長,根本無法在合理的時間內解決問題。于是,我開始思考如何利用動態規劃(Dynamic Programming,DP)來優化這個問題。

動態規劃是一種將復雜問題分解為簡單子問題的算法思想。它通過存儲子問題的解,避免重復計算,從而大大提高算法效率。在這個問題中,我們可以定義一個二維數組 f[i][j],表示用 j 塊木板覆蓋前 i 個牛棚的最小總長度。通過對子問題的逐步求解,我們可以最終得到全局最優解。

動態規劃的思路與狀態轉移方程

動態規劃表的定義

我們定義 f[i][j] 表示用 j 塊木板覆蓋前 i 個牛棚的最小總長度。這是一個二維數組,其中 i 表示牛棚的編號,j 表示使用的木板數量。

狀態轉移方程的推導

對于每個牛棚 i 和木板數目 j,我們有兩種選擇:

  1. 放置新的木板:如果在當前牛棚 i 處放置一塊新的木板,那么總長度將增加 1(因為每個牛棚的寬度相同),并且使用的木板數量增加 1。這種情況下,狀態轉移方程為:
    f [ i ] [ j ] = f [ i ? 1 ] [ j ? 1 ] + 1 f[i][j] = f[i - 1][j - 1] + 1 f[i][j]=f[i?1][j?1]+1

  2. 延長已有木板:如果選擇延長已有木板,那么總長度將增加當前牛棚與前一個牛棚之間的距離,即 pp[i] - pp[i - 1]。這種情況下,狀態轉移方程為:
    f [ i ] [ j ] = f [ i ? 1 ] [ j ] + ( p p [ i ] ? p p [ i ? 1 ] ) f[i][j] = f[i - 1][j] + (pp[i] - pp[i - 1]) f[i][j]=f[i?1][j]+(pp[i]?pp[i?1])

最終,f[i][j] 的值為上述兩種情況的較小值:
f [ i ] [ j ] = min ? ( f [ i ? 1 ] [ j ? 1 ] + 1 , f [ i ? 1 ] [ j ] + ( p p [ i ] ? p p [ i ? 1 ] ) ) f[i][j] = \min(f[i - 1][j - 1] + 1, f[i - 1][j] + (pp[i] - pp[i - 1])) f[i][j]=min(f[i?1][j?1]+1,f[i?1][j]+(pp[i]?pp[i?1]))

初始化

在動態規劃過程中,初始化是非常重要的一步。

  • 當沒有任何牛棚和木板時,總長度為 0,即:
    f [ 0 ] [ 0 ] = 0 f[0][0] = 0 f[0][0]=0

  • 對于其他不可達的狀態,我們將其初始化為一個很大的值(如 1 << 30),表示這些狀態在初始階段是不可到達的。

代碼實現

以下是基于上述思路的完整代碼實現:

#include<bits/stdc++.h>
using namespace std;int m, s, c; // 木板的最大數目、牛棚的總數和牛的數量
int f[205][205] = {0}; // 動態規劃表
int pp[205] = {0}; // 牛棚編號數組int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> m >> s >> c; // 輸入木板數、牛棚總數和牛的數量for (int i = 1; i <= c; ++i) {cin >> pp[i]; // 輸入牛所在的牛棚編號}sort(pp + 1, pp + c + 1); // 對牛棚編號進行排序// 初始化DP表for (int i = 1; i <= c; ++i) f[i][0] = 1 << 30;for (int i = 1; i <= m; ++i) f[0][i] = 1 << 30;// 填充DP表for (int i = 1; i <= c; ++i) {for (int j = 1; j <= m; ++j) {f[i][j] = min(f[i - 1][j - 1] + 1, f[i - 1][j] + (pp[i] - pp[i - 1]));}}cout << f[c][m] << endl; // 輸出結果return 0;
}

測試與驗證

我使用題目中的樣例輸入對代碼進行了測試:

輸入:
4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43

輸出結果為 135,與題目中的預期結果一致。這表明代碼能夠正確處理樣例輸入,并計算出覆蓋所有有牛的牛棚所需的最小木板總長度。

總結與拓展

通過動態規劃的方法,我們可以高效地解決修理牛棚的問題。動態規劃的核心在于將復雜問題分解為簡單子問題,利用狀態轉移方程逐步構建解決方案。在這個過程中,我們不僅需要仔細設計狀態表示,還需要合理推導狀態轉移方程,以確保算法的正確性和高效性。

這種方法不僅適用于這道題,還可以解決類似的區間覆蓋問題。通過不斷練習和總結,我們可以更好地掌握動態規劃的思想和技巧,提升解決復雜問題的能力。希望這篇題解能夠幫助你更好地理解動態規劃的應用,以及如何在實際問題中靈活運用它。

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

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

相關文章

鴻蒙版Flutter庫torch_light手電筒功能深度適配

鴻蒙版Flutter庫torch_light手電筒功能深度適配&#xff1a;跨平臺開發者的光明之路 本項目作者&#xff1a;kirk/堅果 適配倉庫地址 作者倉庫&#xff1a;https://github.com/svprdga/torch_light# 在數字化浪潮的推動下&#xff0c;跨平臺開發框架如 Flutter 憑借其高效、…

【信息系統項目管理師】一文掌握高項常考題型-項目進度類計算

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 一、進度類計算的基本概念1.1 前導圖法1.2 箭線圖法1.3 時標網絡圖1.4 確定依賴關系1.5 提前量與滯后量1.6 關鍵路徑法1.7 總浮動時間1.8 自由浮動時間1.9 關鍵鏈法1.10 資源優化技術1.11 進度壓縮二、基本公式…

深入了解linux系統—— 操作系統的路徑緩沖與鏈接機制

前言 在之前學習當中&#xff0c;我們了解了被打開的文件是如何管理的&#xff1b;磁盤&#xff0c;以及ext2文件系統是如何存儲文件的。 那我們要打開一個文件&#xff0c;首先要先找到這個文件&#xff0c;操作系統又是如何去查找的呢&#xff1f; 理解操作系統搜索文件 …

Docker Hub倉庫介紹

Docker Hub倉庫全解析&#xff1a;從公共市場到私有化部署指南 一、Docker Hub公共鏡像市場 1.1 核心功能解析 全球最大容器鏡像庫&#xff1a;累計托管超500萬鏡像核心服務矩陣&#xff1a; #mermaid-svg-CAMkhmtSWKEUw7z0 {font-family:"trebuchet ms",verdana,a…

redis使用RDB文件恢復數據

設置存盤間隔為120秒且10個key改變數據自動存盤使用RDB文件恢復數據 IP地址主機名192.168.10.170redis170 [rootredis170 ~]# yum install -y redis [rootredis170 ~]# systemctl start redis步驟一&#xff1a;設置存盤間隔為120秒且10個key改變自動存盤 [rootredis170 ~]#…

SpringBoot多環境配置文件切換

resources下application.yml、application-dev.yml、application-prod.yml多個配置文件。 spring:profiles:active: devspring:profiles:active: prod一般都是通過修改spring.profiles.active值來修改加載不同環境的配置信息&#xff0c;可以把切換的dev/prod放到pom.xml文件來…

Java 并發編程高級技巧:CyclicBarrier、CountDownLatch 和 Semaphore 的高級應用

Java 并發編程高級技巧&#xff1a;CyclicBarrier、CountDownLatch 和 Semaphore 的高級應用 一、引言 在 Java 并發編程中&#xff0c;CyclicBarrier、CountDownLatch 和 Semaphore 是三個常用且強大的并發工具類。它們在多線程場景下能夠幫助我們實現復雜的線程協調與資源控…

【Java多線程】多線程狀態下如何安全使用ArrayList以及哈希表

&#x1f50d; 開發者資源導航 &#x1f50d;&#x1f3f7;? 博客主頁&#xff1a; 個人主頁&#x1f4da; 專欄訂閱&#xff1a; JavaEE全棧專欄 多線程安全使用ArrayList 手動加鎖 日常中最常用的方法&#xff0c;使用synchronized進行加鎖&#xff0c;把代碼打包成一份&a…

InnoDB引擎底層解析(二)之InnoDB的Buffer Pool(三)

Buffer Pool 實例 我們上邊說過&#xff0c;Buffer Pool 本質是 InnoDB 向操作系統申請的一塊連續的內存空間&#xff0c;在多線程環境下&#xff0c;訪問 Buffer Pool 中的各種鏈表都需要加鎖處理&#xff0c;在Buffer Pool特別大而且多線程并發訪問特別高的情況下&#xff0…

Netty學習專欄(三):Netty重要組件詳解(Future、ByteBuf、Bootstrap)

文章目錄 前言一、Future & Promise&#xff1a;異步編程的救星1.1 傳統NIO的問題1.2 Netty的解決方案1.3 代碼示例&#xff1a;鏈式異步操作 二、ByteBuf&#xff1a;重新定義數據緩沖區2.1 傳統NIO ByteBuffer的缺陷2.2 Netty ByteBuf的解決方案2.3 代碼示例&#xff1a;…

Vue3逐步拋棄虛擬Dom,React如何抉擇

虛擬DOM&#xff1a;前端界的替死鬼 這玩意兒就是個前端開發的充氣娃娃&#xff01; 你以為它很牛逼&#xff1f;無非是給真DOM當替死鬼&#xff01; 每次數據變&#xff0c;虛擬DOM先擱內存里自嗨一頓&#xff0c;diff算法跟便秘似的算半天&#xff0c;最后才敢碰真DOM。 說白…

分布式鎖總結

文章目錄 分布式鎖什么是分布式鎖&#xff1f;分布式鎖的實現方式基于數據庫(mysql)實現基于緩存(redis)多實例并發訪問問題演示項目代碼(使用redis)配置nginx.confjmeter壓測復現問題并發是1&#xff0c;即不產生并發問題并發30測試,產生并發問題(雖然單實例是synchronized&am…

解決自簽名證書HTTPS告警:強制使用SHA-256算法生成證書

解決自簽名證書HTTPS告警&#xff1a;強制使用SHA-256算法生成證書 一、問題場景 在使用OpenSSL生成和配置自簽名證書時&#xff0c;常遇到以下現象&#xff1a; 瀏覽器已正確導入根證書&#xff08;.pem文件&#xff09;&#xff0c;但訪問HTTPS站點時仍提示不安全連接或證…

線上 Linux 環境 MySQL 磁盤 IO 高負載深度排查與性能優化實戰

目錄 一、線上告警 二、問題診斷 1. 系統層面排查 2. 數據庫層面分析 三、參數調優 1. sync_binlog 參數優化 2. innodb_flush_log_at_trx_commit 參數調整 四、其他優化建議 1. 日志文件位置調整 2. 生產環境核心參數配置模板 3. 突發 IO 高負載應急響應方案 五、…

window 顯示驅動開發-初始化和 DMA 緩沖區創建

若要指示 GPU 支持 GDI 硬件加速&#xff0c;顯示微型端口驅動程序的 DriverEntry 函數實現必須使用指向驅動程序實現的 DxgkDdiRenderKm 函數的指針填充 DRIVER_INITIALIZATION_DATA 結構的 DxgkDdiRenderKm 成員。 DirectX 圖形內核子系統調用 DxgkDdiRenderKm 函數&#xf…

Go語言實戰:使用 excelize 實現多層復雜Excel表頭導出教程

Go 實現支持多層復雜表頭的 Excel 導出工具 目錄 項目介紹依賴說明核心結構設計如何支持多層表頭完整使用示例總結與擴展 項目介紹 在實際業務系統中&#xff0c;Excel 文件導出是一項常見功能&#xff0c;尤其是報表類需求中常見的復雜多級表頭&#xff0c;常規表格組件往…

機器視覺6-halcon高級教程

機器視覺6-halcon高級教程 雙目立體視覺原理視差外極線幾何雙目標定 雙目立體視覺之Halcon標定一&#xff0e;標定結果二.Halcon標定過程1.獲取左右相機圖像中標定板的區域;2.提取左右相機圖像中標定板的MARK點坐標和攝像機外部參數;3.執行雙目標定;4.獲取非標準外極線幾何到標…

板凳-------Mysql cookbook學習 (六)

2025年Pytorch-gpu版本安裝&#xff08;各種情況適用自己的安裝需求&#xff0c;親測絕對有效&#xff0c;示例安裝torch2.6.0&#xff0c;過程詳細面向小白&#xff09;_torch gpu版本-CSDN博客 https://blog.csdn.net/OpenSeek/article/details/145795127 2.2 查錯 import s…

Spring boot和SSM項目對比

目錄對比 springboot目錄 project├─src│ ├─main│ │ ├─java│ │ │ ├─com.example.demo│ │ │ │ ├─config // 存放SpringBoot的配置類│ │ │ │ ├─controller // 存放控制器類│ │ │ │ ├─entity // 存…

《關于潯川社團退出DevPress社區及內容撤回的聲明》

《關于潯川社團退出DevPress社區及內容撤回的聲明》 尊敬的DevPress社區及讀者&#xff1a; 經潯川社團內部決議&#xff0c;我社決定自**2025年5月26日**起正式退出DevPress社區&#xff0c;并撤回所有由我社成員在該平臺發布的原創文章。相關事項聲明如下&#xff1a; …