信息學奧賽一本通 1929:【04NOIP普及組】火星人 | 洛谷 P1088 [NOIP 2004 普及組] 火星人

【題目鏈接】

ybt 1929:【04NOIP普及組】火星人
洛谷 P1088 [NOIP 2004 普及組] 火星人

【題目考點】

1. 深搜回溯
2. STL next_permutation函數

頭文件<algorithm>
函數定義:next_permutation(lb, ub, cmp)
lb:區間下界,為指針或迭代器
ub:區間上界,為指針或迭代器
cmp:函數或仿函數,指定比較規則,默認為less仿函數。
使區間[lb, ub)范圍內的元素變為其下一個排列,復雜度為 O ( n ) O(n) O(n)

如果不傳參數cmp,對整型序列取其下一個排列,其下一個排列就是將[lb, ub)區間內元素的全排列按字典序升序給出后,當前序列的下一個序列。

【解題思路】

火星人的手指排列就是一個1到n的排列,該排列表示的數就是該排列在按字典序排序的1到n的全排列中是第幾個排列
要想使該排列表示的數加上m,而后得到手指序列,就是要取按字典序排序的在1到n的全排列中,當前排列后的第m個排列。

解法1:深搜回溯

深搜求全排列是深搜回溯的模板題,相信各位同學都會寫的。

#include <bits/stdc++.h>
using namespace std;
int num[10005], n, m;
bool vis[10005];
void dfs(int k)
{if(k > n){for(int i = 1; i <= n; ++i)cout << num[i] << ' ';cout << '\n';return;}for(int i = 1 ; i <= n; ++i) if(!vis[i]){num[k] = i;vis[i] = true;dfs(k + 1);vis[i] = false;}
}
int main()
{cin >> n >> m;dfs(1);return 0;
}

而現在是需要從深搜回溯求全排列的中間某狀態出發,向后繼續搜索,搜索到第m個排列時輸出。

這個過程好比一個話劇,一開始就要從第二幕開始演,那么需要直接布置第二幕的舞臺,相關演員也要好像第一幕都演完了的一樣,直接開始第二幕演出。而不需要重新從第一幕開始演。

當前num數組的初值實際是通過輸入得到的。我們需要讓num數組當前的值是通過搜索得到的。
這是一個預先處理的過程,設bool類型量pre,初值為真,pre為真表示當前在進行預處理,使整個dfs過程達到剛好搜索出輸入的num序列的狀態。
調用dfs(1),搜索確定第一個數的值,如果第1個數的值是num[1],那么此時i循環到的值應該是num[1]
遞歸調用dfs(2),搜索確定第二個數的值,如果第2個數的值是num[2],那么此時i循環到的值應該是num[2]

調用dfs(k)時,確定第k個數是num[k],那么該次調用中i應該循環到num[k]。因此在dfs(k)中,for循環i的初值應該設為num[k]
k>n時,進入搜索的遞歸出口,此時應該結束預處理,將pre設為假。
而后就開始正常的搜索排列的過程,非預處理狀態下for循環i的初值應該為1。
設計數變量ct,每搜索到一個排列計數增加1。當計數達到m時,找到了輸入序列后的第m序列,將其輸出,而后結束遞歸。

解法2:使用next_permutation

STL中的next_permutation可以取一個序列的下一個排列。循環m次,每次循環取下一個排列,再將序列輸出,即為結果。

【題解代碼】

解法1:深搜回溯
#include <bits/stdc++.h>
using namespace std;
int num[10005], n, m, ct;
bool vis[10005], isPre = true;//isPre:是否在進行預處理 
void dfs(int k)
{if(k > n){if(isPre){isPre = false;return;}if(++ct == m)//如果已經搜索到后面第m個排列,則輸出結果 {for(int i = 1; i <= n; ++i)cout << num[i] << ' ';}return;}if(ct == m)//ct為m表示已經輸出結果,結束搜索 return;for(int i = isPre ? num[k] : 1 ; i <= n; ++i) if(!vis[i]){num[k] = i;vis[i] = true;dfs(k + 1);vis[i] = false;}
}
int main()
{cin >> n >> m;for(int i = 1; i <= n; ++i)cin >> num[i];dfs(1);return 0;
}
解法2:使用next_permutation
#include <bits/stdc++.h>
using namespace std;
#define N 10005
int n, m, a[N];
int main()
{cin >> n >> m;for(int i = 1; i <= n; ++i)cin >> a[i];for(int i = 1; i <= m; ++i)next_permutation(a+1, a+1+n);for(int i = 1; i <= n; ++i)cout << a[i] << ' ';return 0;
}

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

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

相關文章

借助 AI 工具使用 Python 實現北京市店鋪分布地理信息可視化教程

一、項目概述 本項目通過 Python 的pyecharts庫&#xff0c;結合 AI 工具輔助代碼編寫與邏輯梳理&#xff0c;實現北京市店鋪數量分布及區域連線的地理信息可視化&#xff0c;最終生成交互式地圖圖表。 二、準備工作 1. 環境與工具 Python 環境&#xff1a;確保已安裝 Pyth…

Python項目打包指南:PyInstaller與SeleniumWire的兼容性挑戰及解決方案

前言 前段時間做一個內網開發的需求&#xff0c;要求將selenium程序打包成.exe放在內網的win7上運行&#xff0c;在掘金搜了一圈也沒有發現相關文章&#xff0c;因此將過程中踩到的坑記錄分享一下。 本文涵蓋了具體打包操作、不同模塊和依賴項的兼容性解決方案&#xff0c;以…

(一)棧結構、隊列結構

01-線性結構-數組-棧結構 線性結構&#xff08;Linear List)是由n&#xff08;n>0)個數據元素&#xff08;結點&#xff09; a[0], a[1], a[2], a[3],...,a[n-1]組成的有限序列 數組 通常數組的內存是連續的&#xff0c;所以在知道數組下標的情況下&#xff0c;訪問效率是…

【學Rust寫CAD】35 alpha_mul_256(alpha256.rs補充方法)

源碼 // Calculates (value * alpha256) / 255 in range [0,256], // for [0,255] value and [0,256] alpha256. pub fn alpha_mul_256(self,value: u32) -> Alpha256 {let prod value * self.0;Alpha256((prod (prod >> 8)) >> 8) }代碼分析 這個函數 alph…

C# 與 相機連接

一、通過組件連接相機 需要提前在VisionPro里面保存一個CogAcqFifoTool相機工具為 .vpp 定義一個相機工具 CogAcqFifoTool mAcq null;將保存的相機工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);給窗口相機…

Java并發編程高頻面試題

一、基礎概念 1. 并行與并發的區別&#xff1f; 并行&#xff1a;多個任務在多個CPU核心上同時執行&#xff08;物理上同時&#xff09;。并發&#xff1a;多個任務在單CPU核心上交替執行&#xff08;邏輯上同時&#xff09;。類比&#xff1a;并行是多個窗口同時服務&#x…

LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models

文章&#xff1a;ECIR 2025會議 一、動機 背景&#xff1a;利用LLMs強大的能力&#xff0c;將一個查詢&#xff08;query&#xff09;和一組候選段落作為輸入&#xff0c;整體考慮這些段落的相關性&#xff0c;并對它們進行排序。 先前的研究基礎上進行擴展 [14,15]&#xff0c…

Python高級爬蟲之JS逆向+安卓逆向1.2節: 變量與對象

目錄 引言&#xff1a; 1.2.1 Python中的變量 1.2.2 變量的命名與可讀性 1.2.3 Python中的對象 1.2.4 跟大神學高級爬蟲安卓逆向 引言&#xff1a; 大神薯條老師的高級爬蟲安卓逆向教程&#xff1a; 這套爬蟲教程會系統講解爬蟲的初級&#xff0c;中級&#xff0c;高級知…

可發1區的超級創新思路(python 實現):一種輕量化的動態稀疏門控網絡

首先聲明,該模型為原創!原創!原創!且該思路還未有成果發表,感興趣的小伙伴可以借鑒! 一、應用領域 視頻異常檢測、生成視頻檢測。 二、模型解析 該模型由1.關鍵幀動態選擇機制、2.關鍵幀動態選擇機制以及3.關鍵幀動態選擇機制三大核心組件構成,形成端到端的視頻異常…

使用NVM下載Node.js管理多版本

提示&#xff1a;我解決這個bug跟別人思路可能不太一樣&#xff0c;因為我是之前好用&#xff0c;換個項目就不好使了&#xff0c;倦了 文章目錄 前言項目場景一項目場景二解決方案&#xff1a;下載 nvm安裝 nvm重新下載所需Node 版本nvm常用命令 項目結構說明 前言 提示&…

MySQL數據庫經典面試題解析

1. MySQL 索引使用有哪些注意事項呢? 可以從三個維度回答這個問題:索引哪些情況會失效,索引不適合哪些場景,索引規則 索引哪些情況會失效 查詢條件包含or,可能導致索引失效如何字段類型是字符串,where時一定用引號括起來,否則索引失效like通配符可能導致索引失效。聯合…

C#結合SQLite數據庫使用方法

一、關于SQLite SQLite 是一個輕量級的嵌入式關系型數據庫管理系統&#xff08;RDBMS&#xff09;。與傳統的數據庫管理系統&#xff08;如 MySQL、PostgreSQL 或 SQL Server&#xff09;不同&#xff0c;SQLite 并不需要運行單獨的服務器進程&#xff0c;它的數據庫存儲在一個…

深入解析 MySQL 中的日期時間函數:DATE_FORMAT 與時間查詢優化

深入解析 MySQL 中的日期時間函數&#xff1a;DATE_FORMAT 與時間查詢優化 在數據庫管理和應用開發中&#xff0c;日期和時間的處理是不可或缺的一部分。MySQL 提供了多種日期和時間函數來滿足不同的需求&#xff0c;其中DATE_FORMAT函數以其強大的日期格式化能力&#xff0c;…

如何深刻理解Reactor和Proactor

前言&#xff1a; 網絡框架的設計離不開 I/O 線程模型&#xff0c;線程模型的優劣直接決定了系統的吞吐量、可擴展性、安全性等。目前主流的網絡框架&#xff0c;在網絡 IO 處理層面幾乎都采用了I/O 多路復用方案(又以epoll為主)&#xff0c;這是服務端應對高并發的性能利器。 …

筆試專題(七)

文章目錄 乒乓球筐&#xff08;哈希&#xff09;題解代碼 組隊競賽題解代碼 刪除相鄰數字的最大分數&#xff08;線性dp&#xff09;題解代碼 乒乓球筐&#xff08;哈希&#xff09; 題目鏈接 題解 1. 兩個哈希表 先統計第一個字符串中的字符個數&#xff0c;再統計第二個字…

清晰易懂的 Flutter 卸載和清理教程

以下是為 Flutter 徹底卸載與清理教程&#xff0c;覆蓋 Windows、macOS、Linux 系統&#xff0c;步驟清晰無殘留&#xff0c;確保完全刪除 Flutter SDK、依賴工具及 IDE 配置。 一、通用步驟&#xff1a;確認 Flutter 安裝方式 Flutter 通常通過以下方式安裝&#xff1a; 手動…

關于反卷積

&#x1f9e0; 什么是反卷積&#xff1f; 反卷積&#xff08;Deconvolution&#xff09;&#xff0c;通常也稱為轉置卷積&#xff08;Transpose Convolution&#xff09;&#xff0c;是一種用于擴展輸入特征圖的操作&#xff0c;通常用于生成圖像或上采樣任務中。與標準卷積操…

【機器學習】ROC 曲線與 PR 曲線

目錄 一、混淆矩陣&#xff1a;分類評估的基礎 二. ROC 曲線 (Receiver Operating Characteristic Curve) 三. PR 曲線 (Precision-Recall Curve) 3.1 核心思想 4. 何時使用 ROC 曲線和 PR 曲線&#xff1f; 實驗結果 6. 總結 在機器學習的分類任務中&#xff0c;我們訓…

Python高階函數-map

map() 是 Python 內置的一個高階函數&#xff0c;它接收一個函數和一個可迭代對象作為參數&#xff0c;將函數依次作用在可迭代對象的每個元素上&#xff0c;并返回一個迭代器&#xff08;Python 3.x 中&#xff09;。 基本語法 map(function, iterable, ...)function: 應用于…

上海餐飲市場數據分析與可視化

上海作為中國的經濟中心和國際化大都市,其餐飲市場具有高度的多樣性和競爭性。隨著消費者需求的不斷變化,餐飲行業的從業者和投資者需要深入了解市場現狀和趨勢,以便制定更有效的商業策略。本文將通過數據分析和可視化技術,深入探討上海餐飲市場的現狀和趨勢,為餐飲從業者…