小馬搬運物品-第13屆藍橋杯省賽Python真題精選

[導讀]:超平老師的Scratch藍橋杯真題解讀系列在推出之后,受到了廣大老師和家長的好評,非常感謝各位的認可和厚愛。作為回饋,超平老師計劃推出《Python藍橋杯真題解析100講》,這是解讀系列的第89講。

小馬搬運物品,本題是2022年4月23日舉辦的第13屆藍橋杯青少組Python編程省賽真題編程部分第4題,13屆一共舉辦了兩次省賽,這是第二次省賽。題目要求編程計算小馬將N件物品從河的一岸搬運到河的另一岸一共有多少種方案。

先來看看題目的要求吧。

一.題目說明

時間限制:3000MS

內存限制:589824K8

編程實現:

小馬需要將N件物品從河的一岸搬運到河的另一岸,每次搬運的物品為1到3件。請問小馬將N件物品全部搬運過去有多少種方案。

例如:N = 3,將3件物品全部搬運過去有4種方案:

方案一:第一次搬運1件,第二次搬運1件,第三次搬運1件;

方案二:第一次搬運1件,第二次搬運2件;

方案三:第一次搬運2件,第二次搬運1件;

方案四:一次搬運3件。

輸入描述:

輸入一個正整數N,表示需要搬運的物品數

輸出描述:

輸出將N件物品全部搬運過去有多少種方案

樣例輸入:

3

樣例輸出:

4

評分標準:

  • 10分:能正確輸出一組數據;

  • 10分:能正確輸出兩組數據;

  • 20分:能正確輸出三組數據;

  • 20分:能正確輸出四組數據。

二.思路分析

這是一道經典的算法題,涉及的知識點包括循環、條件、列表、遞歸、動態規劃等。

看完題目描述,你腦海里首先想到的是什么呢?

如果你想到的是斐波那契數列,那么恭喜你,這道題基本上就可以拿下了。

圖片

實際上,這是斐波那契數列的變種問題。

對于經典的斐波那契數列來說,每一項(第1項和第2項除外)都只和前面的兩項有關系,即:

f(n)?=?f(n?-?1)?+?f(n?-?2)

本題中小馬的搬運方案,每一項(前面3項除外)都和前面的三項有關系,如下:

f(n)?=?f(n?-?1)?+?f(n - 2) + f(n - 3)

這是怎么推導出來的呢?

對于這種具有遞推性質的問題,通常只需要考慮最后一步是如何計算的,就可以迅速的確定推導公式。

我們使用f(n)表示搬運n件物品的方案數量,最后一次到底搬運幾件物品呢?

可以分3種情況討論:

  • 搬運3件物品,那么搬運n - 3件物品的方案數為f(n - 3);

  • 搬運2件物品,那么搬運n - 2件物品的方案數為f(n - 2);

  • 搬運1件物品,那么搬運n - 1件物品的方案數為f(n - 1);

根據加法原理,當完成一件事情有n種不同的方式,且這些方式之間互不影響,那么完成這件事情的總方法數就是各類方式中的方法數之和。

因此,總的方案數量f(n)就等于f(n - 1)?+ f(n - 2) + f(n - 3)。

對于斐波那契數列及其變種這類問題,通常有如下三種解決方案:

  • 遞歸算法

  • 動態規劃

  • 遞推算法

不管使用哪一種思路,都需要單獨考慮邊界問題,對于本題而言,需要考慮前3項。

如果只有一件物品,毫無疑問只有一種方法,即f(1) = 1。

如果有兩件物品,可以一次搬運兩件,也可以分兩次,每次搬運一件,所以一共有兩種方案,即f(2) = 2。

如果有三件物品,可以每次搬運一件,分3次搬運,也可以一次搬運3件,還可以第一次搬運1件,第二次搬運2件,又或者是第一次搬運2件,第二次搬運1件,一共有4種方案,即f(3) = 4。?

思路有了,接下來,我們就進入具體的編程實現環節。

三.編程實現

根據上面的思路分析,我們分別使用3種方案來編寫程序:

  • 遞歸算法

  • 動態規劃

  • 遞推算法

1. 遞歸算法

遞歸算法的重點是定義遞歸函數,代碼如下:

圖片

代碼比較簡單,但是隨著n的增加,代碼運行的時間會越來越長,效率會急劇下降。

其原因在于存在大量重復的計算,可以增加一個備忘錄將每一次的計算結果保存起來,避免重復計算。

使用帶備忘錄的遞歸代碼如下:

圖片

代碼不多,強調一點,這里的memo列表就是備忘錄,前3項不需要保存,從第4項開始保存,對應于memo[4]。

有了備忘錄,算法效率大大提高。

2. 動態規劃

這里的推導公式(狀態轉移方程)和初始狀態都已經確定好了,代碼就比較簡單了,如下:

圖片

代碼并不多,說明4點:

1). 這里定義函數f(n)用于計算搬運n件物品的方案數量,主要是為了方便處理邊界條件,但它不是遞歸函數;

2). Python支持多變量賦值運算,因此可以直接寫成dp[1], dp[2], dp[3] = 1, 2, 4,代碼看起來更加緊湊;

3). 在循環計算的時候,從第4項開始,所以range()函數的起點是4;

4). dp列表的最后一項就是要計算的方案數量,可以使用dp[n]獲取,也可以使用dp[-1]獲取。

3. 遞推算法

針對上面的動態規劃算法,仔細想一想,每一項只和前3項有關,是不是只要保存這3項就可以了呢?

答案是肯定的,只需要4個變量就夠了,1個表示當前項,另外3個用來保存前3項,從而節省了一個列表,這就是遞推的寫法,也叫迭代,代碼如下:

圖片

代碼不難,強調一點,由于每一次都需要保存最后3項,需要不斷更新f1,f2,f3的值,這就是f1, f2, f3 = f2, f3, f4的作用。

至此,整個程序就全部完成了,你可以輸入不同的數據來測試效果啦。

四.總結與思考

本題代碼在14行左右,涉及到的知識點包括:

  • 循環語句;

  • 條件語句;

  • 列表;

  • 遞歸算法;

  • 動態規劃函數;

  • 遞推算法;

本題分值為60分,難度中等。關鍵點有兩個,一是找到搬運物品方案的規律,確定好推導公式,二是使用多種算法來實現。

在找規律確定推到公式的問題時,一定要學會運用遞歸思維,將問題簡化為兩個步驟。最后一步保留,最后一步之前的所有步驟當作一步,然后看最后一步是如何計算出來的。切不可小瞧了這一點,在編程中,有很多問題都可以使用這一思維來解決。

本教程講解了3種解決方案,這3種方案絕不是孤立的,它們之間都有一個共同的觀點,這就是推導公式。

實際上,凡是有推導公式的問題,基本上可以采用這3種算法,尤其是帶備忘錄的遞歸和動態規劃。如果說遞歸是自頂向下的推導過程,那么動態規劃就是自底向上的推導過程。

和斐波那契數列相關的題目在歷屆真題中多次出現,如下:

  • 《病毒繁殖-第12屆藍橋杯選拔賽Python真題精選》

  • 《密室逃脫游戲-第12屆藍橋杯省賽Python真題精選》

  • 《跳房子游戲-第13屆藍橋杯選拔賽Python真題精選》

你可以放在一起來分析對比,以加深理解。

你還有什么好的想法和創意嗎,也非常歡迎和超平老師分享探討。

如果你覺得文章對你有幫助,別忘了點贊和轉發,予人玫瑰,手有余香😄

需要源碼的,可以移步至“超平的編程課”gzh。

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

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

相關文章

如何與Honda建立EDI連接?

你是本田Honda的新供應商,需要具備EDI電子數據交換功能嗎?在與本田Honda交換EDI消息時需要幫助嗎?本文將帶你快速了解Honda的EDI需求,明確EDI對接需要完成的工作。 項目背景 本田是一家世界領先的汽車制造商,在全球2…

倉庫選址問題【數學規劃的應用(含代碼)】阿里達院MindOpt

本文主要講述使用MindOpt工具優化倉庫選址的數學規劃問題。 視頻講解👈👈👈👈👈👈👈👈👈 一、案例場景 倉庫選址問題在現代物流和供應鏈管理中具有重要的應用。因為倉庫…

《數據結構與算法基礎 by王卓老師》學習筆記——2.2線性表的案例引入

案例一:一元多項式的運算 案例二:稀疏多項式的運算 案例三:圖書信息管理系統 總結

【Leetcode】520. 檢測大寫字母

文章目錄 題目思路代碼復雜度分析時間復雜度空間復雜度 結果總結 題目 題目鏈接🔗我們定義,在以下情況時,單詞的大寫用法是正確的: 全部字母都是大寫,比如 “USA” 。單詞中所有字母都不是大寫,比如 “le…

Mybatis入門——語法詳解:基礎使用、增刪改查、起別名、解決問題、注釋、動態查詢,從入門到進階

文章目錄 1.基礎使用1.添加依賴2.在resouces文件下新建xml文件db.properties3.在resouces文件下新建xml文件mybatis-config-xml4.創建一個MybatisUtils工具類5.創建xml文件XxxMapper.xml映射dao層接口6.添加日志5.測試 2.增刪改查1.select2.delete3.update4.insert5.模糊查詢6.…

同心創建 共踐食安 | 趙夢澈榮獲食品安全大使

“民族要復興,鄉村必振興”,為深入貫徹落實國家鄉村振興戰略,推進鄉村全面振興不斷取得新成效,助力全國優質食品農產品的宣傳推廣、市場營銷、品牌創建工作,由中國食品安全報社主辦,商業發展中心、健康中國…

python數據分析與可視化一

公共部分 # 引入數據分析工具 Pandas import pandas as pd # 引入數據可視化工具 Matplotlib import matplotlib.pyplot as plt # 引入數據可視化工具 Seaborn (基于matplotlib) import seaborn as sns # 解決輸出時的列名對齊問題 pd.set_option(display.unicode.east_…

Python多線程編程詳解

Python多線程編程詳解 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 多線程編程是利用計算機多核心和多線程處理器的優勢,提高程序并發性能的重要…

如何申請免費SSL證書以消除訪問網站顯示連接不安全提醒

在當今互聯網時代,網絡安全已成為一個不可忽視的問題。當用戶瀏覽一些網站時,有時會看到瀏覽器地址欄出現“不安全”的提示,這意味著該網站沒有安裝SSL證書,數據傳輸可能存在風險。那么,如何消除這種不安全提醒&#x…

2024年6月,Altair被Gartner魔力象限評為數據科學與機器學習平臺領導者

Altair 因其愿景完整性和執行能力被評為領導者 2024 年 6 月 20 日,Altair(納斯達克股票代碼:ALTR)宣布,Altair RapidMiner 被 Gartner Magic Quadrant?(魔力象限)評為數據科學與機器學習平臺領…

SpringBoot配置參數獲取

1、使用Value注解 import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;Component public class MyBean {Value("${myapp.name}") private String appName;public void printAppName() {System.out.print…

冪等生產者和事務生產者

Kafka消息交付 Kafka消息交付可靠性保障以及精確處理一次語義的實現。 所謂的消息交付可靠性保障,是指Kafka對Producer和Consumer要處理的消息提供什么樣的承諾。常見的承諾有以下三種: 最多一次(atmost once):消息…

SpringBoot:SpringBoot 調用第三方接口的幾種方式

一、前言 在項目中調用第三方接口時,確實需要根據項目的技術棧、架構規范以及具體的業務需求來選擇最適合的調用方式。比如:RESTful API調用、Feign聲明式HTTP客戶端、Apache HttpClient等調用方式,每種方式都有其適用場景和優勢。下面我們就…

倉庫管理系統16--入庫管理

原創不易&#xff0c;打字不易&#xff0c;截圖不易&#xff0c;多多點贊&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;財務自由明日實現。 1、創建物資入庫用戶控件 <UserControl x:Class"West.StoreMgr.View.InStoreView"xmlns"http://schema…

CAS自旋解析

CAS全稱CompareAndSwap(比較并交換)&#xff0c;是cpu的指令&#xff0c;調用時不涉及上下文的切換。Java中屬于樂觀鎖的一種&#xff0c;具體流程如下圖&#xff1a; 具體的實現使用的是Unsafe類去調用native修飾的compareAndSwap方法&#xff0c;4個字段分別是對象實例&#…

PTA—C語言期末復習(判斷題)

1. C語言程序是從源文件的第一條語句開始執行的 &#xff08;F&#xff09; 在 C 語言中&#xff0c;程序是從 main 函數開始執行的&#xff0c;而不是從源文件的第一條語句開始執行 2. 若變量定義為double x;&#xff0c;則x % 2是符合C語言語法的表達式 &#xff08;F&#…

通過nginx去除 api url前綴 并保持后面剩余的url不變向后臺請求

如 我前臺瀏覽器向后臺請求的接口是 http://127.0.0.1:5099/api/sample/sample/getbuttonlist 實際的請求接口傳向 http://192.168.3.71:5099/sample/sample/getbuttonlist 方法是向config中加入下面這樣一個server server {listen 5099;location /api/ {rewrite ^/a…

HTML流星雨

目錄 寫在前面 完整代碼 代碼分析 系列文章 寫在最后 寫在前面 歲月如梭&#xff0c;光陰似箭&#xff0c;不知不覺暑假就要來嘍&#xff0c;本期小編用HTML給大家手搓了一個炫酷的流星雨動畫&#xff0c;一起來看看吧。 完整代碼 <!DOCTYPE html> <html lang…

項目風險管理系統有哪些?分享11款主流項目管理系統

本文將分享11款主流項目管理系統&#xff1a;PingCode、Worktile、StandardFusion、MasterControl、ClickUp、SAI360、Netwrix Auditor、MetricStream、Wrike、Celoxis、Zoho Projects。 在項目管理中&#xff0c;風險管理不僅是一個挑戰&#xff0c;也是保證項目順利進行的關鍵…

探索Vim的文本處理能力:精通查找與替換

探索Vim的文本處理能力&#xff1a;精通查找與替換 Vim&#xff0c;作為Linux終端下的王牌文本編輯器&#xff0c;以其強大的功能和靈活性深受開發者和系統管理員的喜愛。在Vim中進行查找和替換是文本編輯中的一項基礎且重要的操作。本文將詳細解釋如何在Vim中執行查找和替換文…