汕头个人网站推广建设,学做快餐的视频网站,做旅游的网站的要素,自媒体怎么申请注册csp信奥赛C标准模板库STL案例应用25 prev_permutation实践
题目描述
排列与组合是常用的数学方法#xff0c;其中组合就是从 nnn 个元素中抽出 rrr 个元素#xff08;不分顺序且 r≤nr \le nr≤n#xff09;#xff0c;我们可以简单地将 nnn 个元素理解为自然数 1,2,…,n…csp信奥赛C标准模板库STL案例应用25prev_permutation实践题目描述排列与组合是常用的数学方法其中组合就是从n nn个元素中抽出r rr个元素不分顺序且r ≤ n r \le nr≤n我们可以简单地将n nn个元素理解为自然数1 , 2 , … , n 1,2,\dots,n1,2,…,n从中任取r rr个数。现要求你输出所有组合。例如n 5 , r 3 n5,r3n5,r3所有组合为123 , 124 , 125 , 134 , 135 , 145 , 234 , 235 , 245 , 345 123,124,125,134,135,145,234,235,245,345123,124,125,134,135,145,234,235,245,345。输入格式一行两个自然数n , r ( 1 n 21 , 0 ≤ r ≤ n ) n,r(1n21,0 \le r \le n)n,r(1n21,0≤r≤n)。输出格式所有的组合每一个组合占一行且其中的元素按由小到大的顺序排列每个元素占三个字符的位置所有的组合也按字典顺序。注意哦输出时每个数字需要3 33个场宽。以 C 为例你可以使用下列代码coutsetw(3)x;输出占3 33个场宽的数x xx。注意你需要头文件iomanip。输入输出样例 1输入 15 3输出 11 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5思路分析这段代码使用了STL中的prev_permutation函数和0-1位标记法来生成组合。主要思路是二进制位标记法用一个长度为n的数组a前r个位置设置为1表示选中其余位置为0表示不选中。例如n5, r3时初始数组为[1,1,1,0,0]。利用prev_permutation该函数生成当前序列的上一个字典序排列。由于初始序列是降序1在前0在后通过不断获取前一个排列可以得到所有不同的组合方式。输出组合对每个排列输出值为1的位置对应的数字i1因为题目从1开始计数。字典序输出prev_permutation按照降序生成排列但输出时我们按索引升序读取因此组合内部从小到大排列整体组合也按字典序输出。代码实现#includebits/stdc.h// 包含所有标准库usingnamespacestd;intn,r;// n: 总元素个数, r: 要选择的元素个数intmain(){cinnr;// 读取输入// 创建一个长度为n的vector前r个元素为1其余为0// 例如n5,r3时a [1,1,1,0,0]vectorinta(n,0);for(inti0;ir;i){a[i]1;// 前r位标记为1选中}// 使用do-while确保至少执行一次输出初始组合do{// 遍历数组a输出所有标记为1的位置对应的数字for(inti0;in;i){if(a[i]){// 如果该位置被选中// 使用setw(3)设置场宽为3输出i1题目要求数字从1开始coutsetw(3)i1;}}coutendl;// 每个组合后换行}while(prev_permutation(a.begin(),a.end()));// prev_permutation生成当前序列的上一个字典序排列// 当序列变为完全升序时返回false循环结束return0;}功能分析核心算法特点0-1位标记法用1表示选择该位置数字0表示不选择直观高效。STL利用使用prev_permutation自动生成所有排列避免手动递归实现。字典序保证初始数组a为降序排列1在前0在后prev_permutation按字典序递减生成排列但输出时按索引升序读取恰好得到组合的字典序递增输出。执行流程初始化一个n位二进制序列前r位为1。输出当前1的位置对应的数字组合。生成上一个排列1向左移动。重复步骤2-3直到所有1移到最右侧排列变为升序。示例演示n5, r3初始: 1 1 1 0 0 → 输出: 1 2 3上一个排列: 1 1 0 1 0 → 输出: 1 2 4上一个排列: 1 1 0 0 1 → 输出: 1 2 5…直到: 0 0 1 1 1 → 输出: 3 4 5时间复杂度prev_permutation的时间复杂度O(n)总组合数C(n,r) n!/(r!(n-r)!)总时间复杂度O(C(n,r) * n)空间复杂度O(n) 用于存储标记数组优点代码简洁利用STL减少错误自动按字典序生成组合输出格式符合题目要求注意使用prev_permutation需要包含algorithm头文件初始数组必须是降序排列才能生成所有组合数字从1开始因此输出时是i1完整系列资料请查看专栏《csp信奥赛C标准模板库STL》https://blog.csdn.net/weixin_66461496/category_13108077.html各种学习资料助力大家一站式学习和提升#includebits/stdc.husingnamespacestd;intmain(){cout########## 一站式掌握信奥赛知识! ##########;cout############# 冲刺信奥赛拿奖! #############;cout###### 课程购买后永久学习不受限制! ######;return0;}一、CSP信奥赛C通关学习视频课C语法基础C语法进阶C算法C数据结构CSP信奥赛数学CSP信奥赛STL二、CSP信奥赛C竞赛拿奖视频课信奥赛csp-j初赛高频考点解析CSP信奥赛C复赛集训课12大高频考点专题集训三、考级、竞赛刷题题单及题解GESP C考级真题题解CSP信奥赛C初赛及复赛高频考点真题解析CSP信奥赛C一等奖通关刷题题单及题解详细内容1、csp/信奥赛C完整信奥赛系列课程永久学习https://edu.csdn.net/lecturer/7901 点击跳转2、CSP信奥赛C竞赛拿奖视频课https://edu.csdn.net/course/detail/40437 点击跳转3、csp信奥赛冲刺一等奖有效刷题题解CSP信奥赛C初赛及复赛高频考点真题解析持续更新https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转2025 csp-j 复赛真题及答案解析最新更新2025 csp-x(山东) 复赛真题及答案解析最新更新2025 csp-x(河南) 复赛真题及答案解析最新更新2025 csp-x(辽宁) 复赛真题及答案解析最新更新2025 csp-x(江西) 复赛真题及答案解析最新更新2025 csp-x(广西) 复赛真题及答案解析最新更新2020 ~ 2024 csp 复赛真题题单及题解2019 ~ 2022 csp-j 初赛高频考点真题分类解析2021 ~ 2024 csp-s 初赛高频考点解析2023 ~ 2024 csp-x (山东)初赛真题及答案解析2024 csp-j 初赛真题及答案解析2025 csp-j 初赛真题及答案解析最新更新2025 csp-s 初赛真题及答案解析最新更新2025 csp-x (山东)初赛真题及答案解析(最新更新)2025 csp-x (江西)初赛真题及答案解析(最新更新)2025 csp-x (辽宁)初赛真题及答案解析(最新更新)CSP信奥赛C一等奖通关刷题题单及题解持续更新https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转129 道刷题练习和详细题解涉及模拟算法、数学思维、二分算法、 前缀和、差分、深搜、广搜、DP专题、 树和图4、GESP C考级真题题解GESP(C 一级二级三级)真题题解持续更新https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转GESP(C 四级五级六级)真题题解持续更新https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转· 文末祝福 ·#includebits/stdc.husingnamespacestd;intmain(){cout跟着王老师一起学习信奥赛C;cout 成就更好的自己 ;cout csp信奥赛一等奖属于你! ;return0;}