模擬算法(一):一維數組模擬

目錄

模擬的概念

例1:開關燈

算法思路:

代碼如下:

輸入輸出:

例2:序列操作和查詢

算法思路:

代碼如下:

輸入輸出:

例3:數組折疊

算法思路:

代碼如下:

例4:數字消除

算法思路

代碼如下:

作業1:角谷猜想

作業2:校門外的樹

作業3:乒乓球


模擬的概念

模擬算法就是模擬題目給的操作,用代碼一步一步的描述出來即可。在過程中使用的都是我們已知的各種方法,如數組元素調用、排序、枚舉等等,只是這些過程一般比較復雜。本次課程主要針對一維數組的模擬。

在各類算法競賽中,包括CSP-J/S,NOIP等競賽,經常會出現各類“模擬題目”,遇到這種題大家不需要害怕,甚至可以將其作為“送分題”,因為你只需要按照題目敘述的方式來寫程序就能得到最終答案。模擬不是一種算法,而是一種技巧,要想掌握模擬題目,就需要多讀題、多整理細節問題。

例1:開關燈

【描述】有n盞燈,從1到N按順序依次編號,初始時所有燈都處于開啟狀態;有m個人,從1到m依次編號。第一個人將燈全部關閉,第二個人將編號為2的倍數的燈打開,第三個人將編號為3的倍數的燈做相反處理(即將打開的燈關閉,將關閉的燈打開)。依照編號遞增順序,以后的人都一樣,將凡是自己編號倍數的燈做相反處理。請問:當第m個人操作之后,哪幾盞燈是關閉的,按從小到大輸出其編號,用逗號間隔。

【輸入】一行,n和m,空格隔開

【輸出】順次輸出關閉的燈的編號,用逗號隔開

【輸入樣例】10 1010

【輸出樣例】1,4,9

算法思路:

這個問題是一個經典的編程問題,通常被稱為“燈泡問題”或“約瑟夫環問題”的變體。問題的核心在于模擬每個人對燈的操作,并跟蹤每盞燈的狀態。以下是解決這個問題的詳細思路:

?1. 初始化

- 創建一個數組 `lights`,長度為 `n+1`(因為燈的編號從1到n),初始時所有燈都設置為開啟狀態(例如,可以用 `true` 表示開啟)。

?2. 模擬操作

? - 對于每個人(從1到m),執行以下操作:
? - 遍歷所有燈,找到編號是當前人編號的倍數的燈。
? - 切換這些燈的狀態(如果燈是開啟的,則關閉;如果燈是關閉的,則開啟)。

3. 狀態切換

? - 燈的狀態切換可以通過簡單地取反數組中對應位置的值來實現。例如,如果 `lights[j]` 是? `true`,則將其設置為 `false`,反之亦然。

?4. 收集結果

? - 在所有人操作完成后,遍歷 `lights` 數組,收集所有關閉的燈的編號。

?5. 輸出結果

? - 將收集到的關閉的燈的編號按從小到大的順序輸出,編號之間用逗號隔開。

代碼如下:

#include <iostream>
using namespace std;
int main(){bool lights[1000];int n,m;cin>>n>>m;for(int i=1;i<=n;i++){lights[i]=true;}for(int i=1;i<=m;i++){for(int j=i;j<=n;j=j+i)lights[j]=!lights[j];}int cnt=0;for(int i=1;i<=n;i++){if(!lights[i]){cnt++;if(cnt==1) cout<<i;else cout<<","<<i;}	}

輸入輸出:

例2:序列操作和查詢

【描述】現有一個長度為n的數組,對這個數組進行m次操作,可以對數組進行的操作分為以下三類:

輸入1 i: 表示輸出數組中第i個元素的值;

輸入2 i v:表示在數組中第i個元素前加入新的元素v;

輸入3 i:表示刪除數組中的第i個元素。

注意:三類操作都要滿足 i <= n。經過m輪操作后,輸出的是哪些數字,每行一個數字。

【輸入】第1行一個整數n,表示數組的初始長度;第2行是n個用空格間隔的數,表示原始的數組;第3行是整數m,表示操作次數。接下來m行是m次操作指令,每個指令一行(題目描述中的三類操作中的一種)。

【輸出】對于第一種操作輸出對應的答案,一行輸出一個數。

算法思路:

對題目的要求一步一步的實行,先保證數組的輸入以后,需要對三種情況進行分類處理。第一種處理里面有輸出,后面兩種都是在操作。操作的要點是數組的插入和刪除。

插入的話,就要求插入位置后面所有數字向后移動一步,實現a[i+1]=a[i]的操作;

而刪除則需要當前位置后面所有的數字向前移動一步,實現a[i]=a[i+1]。這里需要注意移動的方向,要從頭移動。

代碼如下:


using namespace std;
int main(){int a[1000];int n,m,p,q,v;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];cin>>m;for(int i=1;i<=m;i++){cin>>p;if(p==1){cin>>q;cout<<a[q]<<endl;}else if(p==2){cin>>q>>v;for(int j=n;j>=q;j--)a[j+1]=a[j];a[q]=v;n++;}else{//p=3cin>>q;for(int j=q;j<n;j++)a[j]=a[j+1];n--;}}
}

輸入輸出:

例3:數組折疊

【描述】李雷和韓梅梅在玩數組折疊游戲,游戲規則是,給出n個整數,按照從左到右的順序排列,現在需要將這列整數從中間折疊m次,右邊的疊加到左邊,每次折疊后,重合的兩個數字會相加變成一個新的數字。請你輸出折疊m次后的s數組。
【輸入】第1行是整數n和m;第2行是數組中的n個整數

【輸出】1行。折疊m次后的數組元素

算法思路:

數組對折,需要把后半部分移動到前半部分對應位置進行數組相加,所以移動次數為n/2(即循環次數),然后需要進行的就是數組加法,最后要對數組長度也做n/2的操作,但是這里需要注意的是,如果長度是奇數不能只是簡單的n/2哦,對稱位置怎么找?

如果數組下標從1開始,那么第個元素的對稱元素位置是誰? 找找規律:1對n;2對n-1;3對n-2;i對什么?

代碼如下:

#include <iostream>
using namespace std;int main() {int a[1000]; // 假設數組最大長度為 1000int n, m;cin >> n >> m; // 輸入數組長度和操作次數 for (int i = 0; i < n; i++) { // 輸入數組元素cin >> a[i];}for (int j = 0; j < m; j++) { // 進行 m 次操作for (int i = 0; i < n / 2; i++) { // 遍歷前半部分a[i] = a[i] + a[n - 1 - i]; // 將前半部分和后半部分對應元素相加}if (n % 2 == 1) {// 如果數組長度是奇數,中間元素保持不變n = n / 2 + 1;} else {n = n / 2;}}for (int i = 0; i < n; i++) { // 輸出最終結果cout << a[i] << " ";}return 0;
}

例4:數字消除

【描述】李雷喜歡玩游戲,有一天他在電腦上發現 了一個叫“數字消消消”的游戲,其規則如下: 給定一個長度為n的整型數組,指定一個數a,如果該數組中有3個及3個以上的a連續出現,則該數字將會從數組中消除。

【輸入】第1行是整數n和a;第2行是數組中的n個整數

【輸出】1行。輸出消除后的數組

【樣例輸入】 6? 1

? ? ? ? ? ? ? ? ? ? ? 1 1 1 2 2 3

【樣例輸出】 2 2 3

算法思路

1、輸入處理:

  • 首先讀取兩個整數 na,分別表示數組的長度和需要移除的數字。
  • 然后讀取數組中的 n 個整數到數組 arr 中。

2、雙重循環檢測

  • 使用一個外層循環 for(int i=0; i<n; i++) 遍歷數組的每個元素。

  • 對于每個元素,使用一個內層循環 for(int j=i; j<n; j++) 檢查從當前元素開始的連續相同數字的數量。

  • 如果當前元素 arr[j] 等于 a,則增加計數器 num;如果不等于 a,則跳出內層循環。

3、移除連續相同數字

  • 如果計數器 num 大于等于 3,說明從索引 i 開始有連續三個或更多的 a,需要跳過這些元素。

  • 使用 i=i+num-1 將外層循環的索引跳過這些連續的 a

  • 如果 num 小于 3,說明當前元素不是連續三個或更多的 a,需要輸出該元素。

4、重置計數器

  • 每次完成一次內層循環后,重置計數器 num 為 0,以便下一次檢測。

5、輸出結果

  • 在外層循環中,對于不滿足連續三個或更多 a 的元素,輸出該元素。

代碼如下:

#include <iostream>
using namespace std;
int main(){int n,a;int arr[1000];cin>>n>>a;for(int i=0;i<n;i++)cin>>arr[i];int num=0;for(int i=0;i<n;i++) {for(int j=i;j<n;j++){if(arr[j]==a)num++;elsebreak;}if(num>=3)i=i+num-1;elsecout<<arr[i]<<" ";num=0;}
}

作業1:角谷猜想

【描述】 所謂角谷猜想,是指對于任意一個正整數,如果是奇數,則乘3加1,如果是偶數,則除以2,得到的結果再按照上述規則重復處理,最終總能夠得到1。如,假定初始整數為5,計算過程分別為16、8、4、2、1。 程序要求輸入一個整數,將經過處理得到1的過程輸出來。

【輸入 】一個正整數N(N <= 2,000,000)

【輸出】從輸入整數到1的步驟,每一步為一行,每一部中描述計算過程。最后一行輸出"End"。如果輸入為1,直接輸出"End"。

【樣例輸入】 5

【樣例輸出】 5*3+1=16

? ? ? ? ? ? ? ? ? ? ? 16/2=8

? ? ? ? ? ? ? ? ? ? ? ?8/2=4

? ? ? ? ? ? ? ? ? ? ? ?4/2=2

? ? ? ? ? ? ? ? ? ? ? ?2/2=1

? ? ? ? ? ? ? ? ? ? ? ?End

【提示】注意計算過程中中間值可能會超過int范圍。

作業2:校門外的樹

【描述】某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。

由于馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的坐標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走后,馬路上還有多少棵樹。

【輸入】第一行有兩個整數L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的坐標。
? ? ? ? 對于20%的數據,區域之間沒有重合的部分;
? ? ? ? 對于其它的數據,區域之間有重合的情況。

【輸出】包括一行,這一行只包含一個整數,表示馬路上剩余的樹的數目。

【樣例輸入】 500? 3

? ? ? ? ? ? ? ? ? ? ? 150? 300

? ? ? ? ? ? ? ? ? ? ? 100? 200

? ? ? ? ? ? ? ? ? ? ? 470? 471

【樣例輸出】 298

作業3:乒乓球

【題目背景】國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革,以推動乒乓球運動在全球的普及。其中?11?分制改革引起了很大的爭議,有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位,他退役之后走上了乒乓球研究工作,意圖弄明白?11?分制和?21?分制對選手的不同影響。在開展他的研究之前,他首先需要對他多年比賽的統計數據進行一些分析,所以需要你的幫忙。

【題目描述】 華華通過以下方式進行分析,首先將比賽每個球的勝負列成一張表,然后分別計算在 11 分制和 21 分制下,雙方的比賽結果(截至記錄末尾)。 比如現在有這么一份記錄,(其中 W 表示華華獲得一分,L 表示華華對手獲得一分):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? WWWWWWWWWWWWWWWWWWWWWWLW

在 11 分制下,此時比賽的結果是華華第一局 11 比 0 獲勝,第二局 11 比 0 獲勝,正在進行第三局,當前比分 1 比 1。而在 21 分制下,此時比賽結果是華華第一局 21 比 0 獲勝,正在進行第二局,比分 2 比 1。如果一局比賽剛開始,則此時比分為 0 比 0。直到分差大于或者等于 2,才一局結束。 注意:當一局比賽結束后,下一局立刻開始。 你的程序就是要對于一系列比賽信息的輸入(WL 形式),輸出正確的結果。

【輸入格式】 每個輸入文件包含若干行字符串,字符串由大寫的 W 、 L 和 E 組成。其中 E 表示比賽信息結束,程序應該忽略 E 之后的所有內容。

【輸出格式】 輸出由兩部分組成,每部分有若干行,每一行對應一局比賽的比分(按比賽信息輸入順序)。其中第一部分是 11 分制下的結果,第二部分是 21 分制下的結果,兩部分之間由一個空行分隔。

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

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

相關文章

MySQL 基礎入門

寫在前面 關于MySQL的下載安裝和其圖形化軟件Navicat的下載安裝,網上已經有了很多的教程,這里就不再贅述了,本文主要是介紹了關于MySQL數據庫的基礎知識。 MySQL數據庫 MySQL數據庫基礎 MySQL數據庫概念 MySQL 數據庫&#xff1a; 是一個關系型數據庫管理系統 。 支持SQL語…

Qt中的多種輸出方式,信號與槽的基本使用

完成Hello World可以通過很多控件實現 如采用編輯框來完成hello world 編輯框分為單行編輯框----QLineEdit 和多行編輯框---QTextEdit 采用單行編輯框&#xff0c;創建項目后&#xff0c;展開forms文件夾&#xff0c;雙擊ui文件進入 qt designer設計頁面 找到line edit 拖到頁…

英語表達年代和世紀

英語表達年代和世紀 1. Century (世紀)1.1. Start and end of centuries 2. Decade (年代)2.1. Usage 3. 英語表達年代和世紀4. HomeworkReferences XXX0 年代指 XXX0 年 - XXX9 年的連續 10 年&#xff0c;例如 1760 年代指 1760 年至 1769 年這連續 10 年。 XX 世紀 X0 年代…

MySQL數據庫管理5

23.事務 1&#xff09;事務&#xff1a;可以認為是做一件事情 需要多個SQL 要么同時成功 要么同時失敗 需求&#xff1a;銀行轉賬update 你的賬戶 把你的錢減少update 你朋友的賬戶 把他的錢增多?這兩個SQL不能只成功一個 要么都成功 要么都失敗那么 我們就需要用到事務了 它…

閉包和裝飾器

什么是閉包 閉包&#xff08;Closure&#xff09;是 Python 中一個非常重要的概念&#xff0c;它是一種特殊的函數對象&#xff0c;通常用于封裝和延遲計算某些值。以下是閉包的詳細定義和解釋&#xff1a; 1.閉包的定義 閉包是指一個函數對象&#xff0c;它不僅包含函數的代…

notepad++8.6.4安裝及細節

notepad8.6.4下載安裝&#xff08;附安裝包&#xff09; 一、安裝包下載1.1方法一&#xff1a;官網下載&#xff08;點擊跳轉&#xff09;1.2方法二&#xff1a;網盤鏈接分享8.6.4版本 二、安裝過程細節2.1這里的組件建議全部勾選。點擊“下一步”。2.2 勾選①&#xff1a;可以…

COZE通關指南:工作流與插件開發

前言 本文隸屬于專欄《AI Agent 通關指南》,該專欄為筆者原創,引用請注明來源,不足和錯誤之處請在評論區幫忙指出,謝謝! 本專欄目錄結構和參考文獻請見《AI Agent 通關指南》 正文 1. 平臺基礎介紹 ?? 1.1 COZE平臺概述 COZE平臺(coze.cn)是一個強大的AI應用開發平臺…

【Block總結】ENLTransformerBlock,高效非局部變換器塊|即插即用

1. 論文信息 標題: Perspective+ Unet: Enhancing Segmentation with Bi-Path Fusion and Efficient Non-Local Attention for Superior Receptive Fields論文地址: arXiv:2406.14052 2. 創新點 雙路徑編碼策略: 在編碼器階段引入雙路徑策略,結合傳統卷積和空洞卷積的結果,平…

【爬蟲】網易云音樂評論數據爬取

文章目錄 &#x1f356; 前言&#x1f3b6;一、抓取要求?二、代碼展示&#x1f3c0;三、運行結果&#x1f3c6;四、知識點提示 &#x1f356; 前言 【爬蟲】網易云音樂歌詞/評論數據爬取 &#x1f3b6;一、抓取要求 描述: 輸入歌曲的id&#xff0c;獲取對應歌曲的用戶評論信…

C++使用Qt Charts創建數據可視化圖表

Qt Charts 是一個強大的工具&#xff0c;用于創建直觀的數據可視化圖表。本文將通過一個具體的示例&#xff0c;展示如何使用 Qt Charts 創建一個包含多條數據序列、自定義坐標軸和隨機數據生成的圖表。 示例代碼解析 以下是一個完整的示例代碼&#xff0c;展示如何使用 Qt Ch…

TCP/IP五層協議

目錄 1. 五層模型結構 2. 各層核心功能與協議 (1) 應用層&#xff08;Application Layer&#xff09; (2) 傳輸層&#xff08;Transport Layer&#xff09; (3) 網絡層&#xff08;Network Layer&#xff09; (4) 數據鏈路層&#xff08;Data Link Layer&#xff09; (5…

【最新版】金媒婚戀系統v10.5最新穩定開源+原生前端小程序 PC端+安裝教程

一.系統簡介 1. 紅娘服務 紅娘服務模塊是該系統的一大特色。專業紅娘會通過分析用戶的個人資料和偏好&#xff0c; 為用戶提供精準的配對建議和個性化服務。用戶可以預約紅娘服務&#xff0c;通過紅娘的介入&#xff0c;提升配對成功率。 2. 相親活動 相親活動模塊用于組織和管…

吳恩達深度學習復盤(5)神經網絡的前向傳播TesorFlow與NumPy實現比對

數據結構差別 NumPy 和 TensorFlow 在數據表示上的差異展開&#xff0c;結合神經網絡實踐中的常見問題進行說明。以下是詳細解析&#xff1a; 一、簡介 數據表示的歷史背景 NumPy 是 Python 科學計算的基礎庫&#xff0c;早期設計為處理多維數組TensorFlow 由 Google Brain 團…

多元高斯分布函數

1、 n n n元向量 假設 n n n元隨機變量 X X X X [ X 1 , X 2 , ? , X i , ? , X n ] T μ [ μ 1 , μ 2 , ? , μ i , ? , μ n ] T σ [ σ 1 , σ 2 , ? , σ i , ? , σ n ] T X i ~ N ( μ i , σ i 2 ) \begin{split} X&[X_1,X_2,\cdots,X_i,\cdots ,X_n…

洞察 Linux 進程管理

一、進程和線程的概念 1.進程 &#xff08;1&#xff09;概念 進程是程序在操作系統中的一次執行過程&#xff0c;是系統進行資源分配和調度的基本單位。進程是程序的執行實例&#xff0c;擁有獨立的資源&#xff08;如內存、文件描述符等&#xff09;。每個進程在創建時會被…

PyTorch 實現圖像版多頭注意力(Multi-Head Attention)和自注意力(Self-Attention)

本文提供一個適用于圖像輸入的多頭注意力機制&#xff08;Multi-Head Attention&#xff09;PyTorch 實現&#xff0c;適用于 ViT、MAE 等視覺 Transformer 中的注意力計算。 模塊說明 輸入支持圖像格式 (B, C, H, W)內部轉換為序列 (B, N, C)&#xff0c;其中 N H * W多頭注…

每日一題(小白)字符串娛樂篇16

分析題意可以了解到本題要求在一串字符串中找到所有組合起來排序遞增的字符串。我們可以默認所有字符在字符串中的上升序列是1&#xff0c;從第一個字符開始找&#xff0c;如果后面的字符大于前面的字符就說明這是一個上序列那么后面字符所在的數組加一&#xff0c;如果連接不上…

Ubuntu 22 Linux上部署DeepSeek R1保姆式操作詳解(Xinference方式)

一、安裝步驟 1.基礎環境安裝 安裝顯卡驅動、cuda&#xff0c;根據自己硬件情況查找相應編號&#xff0c;本篇不介紹這部分內容&#xff0c;只給出參考指令&#xff0c;詳情請讀者自行查閱互聯網其它參考資料。 sudo apt install nvidia-utils-565-server sudo apt install…

Immutable.js 完全指南:不可變數據的藝術與實踐

引言 在現代前端開發中&#xff0c;狀態管理是一個核心挑戰。隨著應用復雜度增加&#xff0c;如何高效、安全地管理應用狀態變得至關重要。Immutable.js 是 Facebook 推出的一個 JavaScript 庫&#xff0c;它提供了持久化不可變數據結構&#xff0c;可以幫助開發者更好地管理應…

字符串數據類型的基本運算

任務描述 本關任務&#xff1a;從后臺輸入任意三個字符串&#xff0c;求最大的字符串。 相關知識 字符串本身是存放在一塊連續的內存空間中&#xff0c;并以’\0’作為字符串的結束標記。 字符指針變量本身是一個變量&#xff0c;用于存放字符串的第 1 個字符的地址。 字符數…