中國電子學會(CEIT)2020年06月真題C語言軟件編程等級考試四級(含詳細解析答案)

中國電子學會(CEIT)考評中心歷屆真題(含詳細解析答案)

C語言軟件編程等級考試四級 2020年06月

編程題四道							總分:100分

一、最長上升子序列(25分)
一個數的序列bi,當b1 < b2< … <bs的時候,我們稱這個序列是上升的。對于給定的一個序列(a1, a2… aN),我們可以得到一些上升的子序列(ai1, ai2,…, aik),這里1<=i1<i2<… <ik <=N。
比如,對于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。這些子序列中最長的長度是4,比如子序列(1,3,5,8)。
你的任務,就是對于給定的序列,求出最長上升子序列的長度。
時間限制: 2000ms
內存限制: 65536kb
輸入
輸入的第一行是序列的長度N (1 <=N<= 1000)。
第二行給出序列中的N個整數,這些整數的取值范圍都在0到10000。輸出
最長上升子序列的長度。
樣例輸入

7
1 7 3 5 9 4 8

樣例輸出

4
#include <iostream>  // 引入輸入輸出流庫
using namespace std;  // 使用標準命名空間int main() {  // 程序主入口int N;  // 定義一個整型變量N,用于存儲用戶輸入的序列長度scanf("%d",&N);  // 從標準輸入讀取一個整數到變量Nint a[1010];  // 定義一個整型數組a,大小為1010,用于存儲用戶輸入的序列for(int i = 0; i < N; i++){  // 循環N次,讀取序列中的每個元素scanf("%d", &a[i]);  // 從標準輸入讀取一個整數到數組a的第i個位置}// 定義dp數組,dp[i]表示以a[i]結尾的最長上升子序列的長度int dp[1010];  dp[0] = 1;  // 初始化dp數組的第一個元素為1,因為任何單個元素都可以視為一個長度為1的上升子序列int max_len = 0;  // 定義一個變量max_len,用于存儲最長上升子序列的長度for(int i = 1; i < N; i++){  // 從序列的第二個元素開始遍歷for(int j = i - 1; j >= 0; j--){  // 對每個元素,向前遍歷它之前的所有元素if(a[i] > a[j]){  // 如果當前元素大于之前的某個元素dp[i] = dp[j] + 1;  // 更新dp[i]為dp[j]+1,表示以a[i]結尾的最長上升子序列長度增加了1break;  // 找到后,跳出內層循環}}max_len = max(max_len, dp[i]);  // 更新最長上升子序列的長度}printf("%d", max_len);  // 輸出最長上升子序列的長度return 0;  // 程序結束,返回0
}/*代碼使用動態規劃的思想解決了LIS問題。對于每個位置i,它都嘗試找到在它之前的位置j,使得a[i] > a[j],并更新dp[i]為dp[j] + 1。這樣,dp[i]就存儲了以a[i]結尾的最長上升子序列的長度。然后,通過遍歷所有的dp[i],可以找到整個序列的最長上升子序列的長度。
*/

二、核電站(25分)
一個核電站有N個放核物質的坑,坑排列在一條直線上。如果連續3個坑中放入核物質,則會發生爆炸,于是,在某些坑中可能不放核物質。
現在,請你計算:對于給定的N,求不發生爆炸的放置核物質的方案總數。
時間限制: 1000ms
內存限制: 131072kb
輸入
輸入文件只有多行,每行對應一個正整數N<= 40;輸出
輸出文件有多行,每行只有一個正整數,表示方案總數。
樣例輸入

1
2
3
4
10

樣例輸出

2
4
7
13
504
#include <iostream>  // 包含C++標準輸入輸出流庫
#include <cstring>   // 包含C++字符串操作庫,用于memset函數
using namespace std; // 使用標準命名空間long long dp[55][7]; // 定義一個二維數組dp,用于存儲動態規劃的狀態。dp[i][j]表示前i個坑中連續埋了j個雷的方案數。int main() {int n; // 定義一個整數n,表示坑的數量for(int c = 0; c<40; c++){ // 循環40次,處理多組數據cin >> n; // 從標準輸入讀取一個整數nif(n <= 0) // 如果n小于等于0,則結束當前循環break;memset(dp,0, sizeof(dp)); // 將dp數組中的所有元素初始化為0dp[1][1] = 1; // 第一個坑放一個核物質的方案數為1dp[1][0] = 1; // 第一個坑不放核物質的方案數為1for(int i = 2; i <= n; i++){ // 從第二個坑開始遍歷到第n個坑for(int j = 0; j < 3; j++){ // 遍歷連續放核物質的數量,從0到2if(j == 0){ // 如果當前連續放核物質的數量為0for(int k = 0; k < 3;k++) // 遍歷前一個坑連續放核物質的數量,從0到2dp[i][j]+= dp[i - 1][k]; // 更新dp[i][j],累加前一個坑所有可能的方案數}else // 如果當前連續放核物質的數量不為0dp[i][j] += dp[i - 1][j - 1]; // 更新dp[i][j],累加前一個坑連續埋了j-1個核物質的方案數}}long long ans = 0; // 定義一個變量ans,用于存儲所有可能的方案數for(int i = 0; i < 3; i++) // 遍歷最后一個坑連續放核物質的數量,從0到2ans += dp[n][i]; // 累加最后一個坑所有可能的方案數到anscout <<ans; // 輸出所有可能的方案數到標準輸出}return 0; // 程序結束,返回0
}/*代碼使用動態規劃的方法解決了放置物體的問題。首先,它初始化了一個二維數組dp來存儲中間結果。然后,它讀取一系列的輸入值n,對于每個n,它都使用動態規劃來計算在n個位置中放置物體的方案數,并將結果輸出到標準輸出。
*/

三、山區建小學(25分)
政府在某山區修建了一條道路,恰好穿越總共m個村莊的每個村莊一次,沒有回路或交叉,任意兩個村莊只能通過這條路來往。
已知任意兩個相鄰的村莊之間的距離為di(為正整數),其中,0 < i < m。為了提高山區的文化素質,政府又決定從m個村中選擇n個村建小學(設0 < n <= m < 500 )。
請根據給定的m、n以及所有相鄰村莊的距離,選擇在哪些村莊建小學,才使得所有村到最近小學的距離總和最小,計算最小值。
時間限制: 24000ms
內存限制: 65536kb
輸入
第1行為m和n,其間用空格間隔;
第2行為(m-1)個整數,依次表示從一端到另一端的相鄰村莊的距離,整數之間以空格間隔。
例如: 10 3 2 4 6 5 2 4 3 1 3,表示在10個村莊建3所學校。第1個村莊與第2個村莊距離為2,第2個村莊與第3個村莊距離為4,第3個村莊與第4個村莊距離為6,…,第9個村莊到第10個村莊的距離為3。
輸出
各村莊到最近學校的距離之和的最小值。
樣例輸入

10 2
3 1 3 1 1 1 1 1 3

樣例輸出

18
#include <algorithm> // 引入算法庫,盡管在這段代碼中并沒有使用到該庫中的功能
#include <cstring>   // 引入字符串操作庫,用于memset函數
#include <iostream>  // 引入輸入輸出流庫
using namespace std; // 使用標準命名空間int dis[510], a[510][510], dp[510][510]; // 定義全局變量:dis用于存儲距離,a用于存儲某個子問題的解,dp用于存儲最終的最優解int main() { // 主函數入口int m, n; // 定義兩個整數變量m和n,分別表示問題的兩個維度memset(a,0,sizeof(a)); // 使用memset函數將二維數組a初始化為0cin >> m >> n; // 從標準輸入讀取m和n的值dis[1] = 0; // 初始化dis數組的第一個元素為0for (int i = 2; i<= m; i++){ // 從2開始遍歷到mcin >> dis[i]; // 讀取dis數組的每個元素dis[i]+= dis[i - 1]; // 更新dis數組,使其存儲的是從第一個元素到當前元素的累積和}for (int i = 1; i <= m; i++) // 遍歷所有可能的子問題的起始點for (int j = i + 1; j <= m; j++) // 遍歷所有可能的子問題的結束點a[i][j] = a[i][j - 1] + dis[j] - dis[(i + j)/ 2]; // 計算子問題的解,這里使用了一個基于累積和的公式for (int i = 1; i <= m; i++) // 初始化dp數組的第一列for(int j = 1; j <= i && j <= n; j++)dp[i][j] = 999999; // 將dp數組初始化為一個很大的數,表示初始時還沒有找到解for (int i =1; i<= m; i++) // 初始化dp數組的第一行dp[i][1] = a[1][i]; // 將dp數組的第一行設置為a數組的第一行的值for (int i = 2; i <= m; i++) // 從第二行開始遍歷dp數組for(int j = 2; j <= i && j <= n; j++) // 遍歷dp數組的每一列for(int k = j - 1; k < i; k++) // 遍歷所有可能的分割點kdp[i][j] = min(dp[i][j], dp[k][j - 1] + a[k + 1][i]); // 更新dp數組的值,尋找最優解cout << dp[m][n] << endl; // 輸出最終的最優解return 0; // 程序結束
}/*這個程序的整體邏輯是動態規劃。首先,它計算了一個累積和數組dis,然后基于這個數組計算了子問題的解a。接著,它使用動態規劃的思想,通過填充dp數組來找到最終的最優解。最后,程序輸出了這個最優解。
*/

四、公共子序列(25分)
我們稱序列Z= <z1,z2…,zk >是序列X=<x1, x2…, xm >的子序列當且僅當存在嚴格上升的序列<i1, i2,… ik >,使得對j =1,2… k,有xij = zj。比如Z= < a, b, f, c >是X=<a, b, c, f, b, c >的子序列。
現在給出兩個序列X和Y,你的任務是找到X和Y的最大公共子序列,也就是說要找到一個最長的序列Z,使得Z既是X的子序列也是Y的子序列。
時間限制: 3000ms
內存限制: 65536kb
輸入
輸入包括多組測試數據。每組數據包括一行,給出兩個長度不超過200的字符串,表示兩個序列。兩個字符串之間由若干個空格隔開。
輸出
對每組輸入數據,輸出一行,給出兩個序列的最大公共子序列的長度。
樣例輸入

abcfbc abfcab
programming contest
abcd mnp

樣例輸出

4
2
0
#include<iostream>    // 引入輸入輸出流庫
#include<cstring>     // 引入字符串操作庫(這里主要是使用memset函數)
#include<cstdio>      // 引入C標準輸入輸出庫(雖然在這段代碼中未直接使用)
using namespace std; // 使用標準命名空間string a,b;           // 定義兩個字符串變量a和b
int dp[220][220];    // 定義一個二維數組dp,用于存儲動態規劃過程中的子問題的解int lcs(){           // 定義一個函數lcs,用于計算最長公共子序列的長度memset(dp,0,sizeof(dp)); // 使用memset函數初始化dp數組,所有元素設為0int lena=a.size(),lenb=b.size(); // 獲取字符串a和b的長度for(int i=1;i<=lena;i++)         // 外層循環,遍歷字符串a的所有字符for(int j=1;j<=lenb;j++)     // 內層循環,遍歷字符串b的所有字符if(a[i-1]==b[j-1])       // 如果當前字符相等dp[i][j]=dp[i-1][j-1]+1; // 更新dp[i][j]為左上角元素加1else                     // 如果當前字符不相等dp[i][j]=max(dp[i-1][j],dp[i][j-1]); // 更新dp[i][j]為上方和左方元素中的較大值return dp[lena][lenb]; // 返回dp數組的最后一個元素,即最長公共子序列的長度
}int main() {           // 主函數while(cin>>a>>b)  // 循環讀取字符串a和bcout<<lcs()<<"\n"; // 調用lcs函數并輸出最長公共子序列的長度,然后換行return 0;          // 程序結束
}
/*這道題使用了動態規劃的方法來求解最長公共子序列問題。通過構建一個二維數組dp來存儲子問題的解,并利用遞推關系逐步填充這個數組,最終得到最長公共子序列的長度。
*/

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

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

相關文章

長期可用的文件二維碼怎么做?在線制作可修改的文件活碼

怎么做一個可以長期使用的文件二維碼呢&#xff1f;現在通過二維碼來傳遞文件是很流行的一種方式&#xff0c;將文件生成二維碼后印刷上墻或者分享給他人都可以快速完成文件的傳播&#xff0c;所以在下發通知、資料等方面用途較多。那么文件二維碼該如何生成呢&#xff1f; 想…

Linux內存地址空間

目錄 一、虛擬地址空間 1.虛擬地址空間的定義 2.虛擬地址空間的布局 二、內存壁壘 1.內存壁壘的定義?編輯 2.段錯誤 三、內存映射的建立與解除 &#xff08;1&#xff09;mmap &#xff08;2&#xff09;munmap &#xff08;3&#xff09;堆內存的分配和釋放 1.sbrk …

Android13 設置固定熱點ip地址192.168.43.1

Android13 設置固定熱點ip地址192.168.43.1 文章目錄 Android13 設置固定熱點ip地址192.168.43.1一、前言二、設置固定ip地址實現1、Android13 代碼中的實現&#xff1a;添加屬性寫法&#xff1a; 2、Android11 或者更舊的代碼中的實現&#xff1a; 三、其他1、Android 代碼獲連…

Python中學習調試requests模塊時出現的大坑(1)

為防止迷路: 學習機械相關,請關注公眾號:南大盛聯 學習軟件,硬件,請關注公眾號號:一訓微課 cmd模式下 不知道上面這行的話,需要補課。 pip install requests 這個不知道的話,也要補課 pip是python的安裝工具。 install是安裝的意思 requests是我們需要安裝的模…

HTML超鏈接去下劃線

當在HTML中創建超鏈接時&#xff0c;默認情況下會顯示為帶有下劃線的藍色文本。如果想要去掉下劃線&#xff0c;可以使用CSS樣式來實現。 示例代碼&#xff1a; <!DOCTYPE html> <html> <head> <style> a {text-decoration: none;color: blue; /* 設…

微信小程序 --- 事件處理

事件處理 一個應用僅僅只有界面展示是不夠的&#xff0c;還需要和用戶做交互&#xff0c;例如&#xff1a;響應用戶的點擊、獲取用戶輸入的值等等&#xff0c;在小程序里邊&#xff0c;我們就通過編寫 JS 腳本文件來處理用戶的操作 1. 事件綁定和事件對象 小程序中綁定事件與…

sora會是AGI的拐點么?

©作者|謝國斌 來源|神州問學 OpenAI近期發布的Sora是一個文本到視頻的生成模型。這項技術可以根據用戶輸入的描述性提示生成視頻&#xff0c;延伸現有視頻的時間&#xff0c;以及從靜態圖像生成視頻。Sora可以創建長達一分鐘的高質量視頻&#xff0c;展示出對用戶提示的精…

PoC免寫攻略

在網絡安全領域&#xff0c;PoC&#xff08;Proof of Concept&#xff09;起著重要的作用&#xff0c;并且在安全研究、漏洞發現和漏洞利用等方面具有重要的地位。攻擊方視角下&#xff0c;常常需要圍繞 PoC 做的大量的工作。常常需要從手動測試開始編寫 PoC&#xff0c;再到實…

vue項目電商

這個項目功能有首頁&#xff0c;分類&#xff0c;商品詳情&#xff0c;購物車&#xff0c;用戶注冊、登錄等等的實現&#xff0c;并且可以在手機上進行展示。 git倉庫地址&#xff1a;https://gitee.com/BisShen/project.git

應用層http協議包解析與https加密策略解析

文章目錄 一.應用層協議--http協議基礎認知二.https協議加密策略解析加密策略1--通信雙方只使用對稱加密加密策略2--通信雙方使用單方非對稱加密加密策略3--通信雙方都使用非對稱加密加密策略4--非對稱加密與對稱加密配合使用中間人攻擊數據簽名與CA證書HTTPS數據安全認證的本質…

二維碼門樓牌管理系統技術服務的分類與應用

文章目錄 前言一、二維碼門樓牌管理系統的分類二、二維碼門樓牌管理系統的應用優勢三、結論 前言 隨著城市管理的精細化和智能化&#xff0c;二維碼門樓牌管理系統成為了現代城市管理的重要工具。該系統將傳統的門牌、樓牌、戶牌與二維碼技術相結合&#xff0c;實現了信息的快…

如何優化一個運行緩慢的SQL查詢?有哪些常見的優化技巧?

如何優化一個運行緩慢的SQL查詢&#xff1f; 當面對一個運行緩慢的SQL查詢時&#xff0c;優化是提升數據庫性能的關鍵步驟。優化查詢不僅可以減少查詢執行時間&#xff0c;還可以降低系統資源消耗&#xff0c;提高整體的系統吞吐量。以下將詳細探討如何優化一個運行緩慢的SQL查…

MySQL:常用的SQL語句

提醒&#xff1a;設定下面的語句是在數據庫名為 db_book執行的。 一、創建表 1. 創建t_booktype表 USE db_book; CREATE TABLE t_booktype(id INT AUTO_INCREMENT, bookTypeName VARCHAR(20),bookTypeDesc varchar(200),PRIMARY KEY (id) );2. 創建t_book表 USE db_book; C…

[筆記] wsl 禁用配置 win系統環境變量+代理

wsl 配置禁用 win系統環境變量 進入 wsl 的 /etc/wsl.conf 目錄&#xff0c;增加以下配置&#xff1a; [interop] enabledfalse appendWindowsPathfalse然后退出wsl&#xff0c;并且執行關閉正在運行的 wsl&#xff0c;執行命令 wsl --shutdown 最后重新進入wsl 即可。 參考…

C語言-----動態內存管理(1)

1.引入 我們之前已經學習了幾種開辟內存空間的方式&#xff1a; &#xff08;1&#xff09;int a10;開辟4個字節大小的空間 &#xff08;2&#xff09;int arr[10]{0}定義數組開辟了一串連續的空間 2.malloc和free (1)malloc開辟內存空間可能會失敗&#xff0c;因此需要檢查…

HTML5+CSS3+JS小實例:文字陰影還能這么玩

實例:文字陰影還能這么玩 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"…

Android java基礎_泛型

一.java泛型是什么 Java 泛型&#xff08;Generic&#xff09;是 Java 5 中引入的一種特性&#xff0c;它允許類、接口和方法在定義時使用一個或多個類型參數&#xff0c;這些類型參數在調用時會被實際類型替換&#xff0c;從而增強了代碼的重用性和類型安全性。通過使用泛型&…

鴻蒙Harmony應用開發—ArkTS聲明式開發(通用屬性:形狀裁剪)

用于對組件進行裁剪、遮罩處理。 說明&#xff1a; 從API Version 7開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。 clip clip(value: boolean | CircleAttribute | EllipseAttribute | PathAttribute | RectAttribute) 按指定的形狀對當…

Spring基礎——XML配置Bean的實例化

目錄 實例化Bean的方式使用構造函數實例化Bean使用靜態工廠的方式實例化Bean使用實例化工廠方式實例化Bean通過實現FactoryBean自定義實例化Bean 實例化Bean的方式 bean的創建本質上就是創建一個或多個具有外部配置屬性的對象&#xff0c;容器在啟動的時候會查看命名Bean的配置…

中美加密監管突傳“巨響”!比特幣突破7萬信號出現!馬斯克一句話掀起大行情!

比特幣本周觸及64000美元高價&#xff0c;2月交易所儲備減少近45000多枚比特幣&#xff0c;市場將其解讀為看漲70000美元的關鍵信號。中美加密監管傳利好&#xff0c;香港加密牌照申請期限結束&#xff0c;已有24家機構入列待批&#xff0c;美國考慮允許比特幣ETF及相關信托期權…