news 2026/3/15 1:47:38

csp信奥赛C++标准模板库STL案例应用25

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
csp信奥赛C++标准模板库STL案例应用25

csp信奥赛C++标准模板库STL案例应用25

prev_permutation实践

题目描述

排列与组合是常用的数学方法,其中组合就是从n nn个元素中抽出r rr个元素(不分顺序且r ≤ n r \le nrn),我们可以简单地将n nn个元素理解为自然数1 , 2 , … , n 1,2,\dots,n1,2,,n,从中任取r rr个数。

现要求你输出所有组合。

例如n = 5 , r = 3 n=5,r=3n=5,r=3,所有组合为:

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(1<n<21,0 \le r \le n)n,r(1<n<21,0rn)

输出格式

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

注意哦!输出时,每个数字需要3 33个场宽。以 C++ 为例,你可以使用下列代码:

cout<<setw(3)<<x;

输出占3 33个场宽的数x xx。注意你需要头文件iomanip

输入输出样例 1
输入 1
5 3
输出 1
1 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位标记法来生成组合。主要思路是:

  1. 二进制位标记法:用一个长度为n的数组a,前r个位置设置为1(表示选中),其余位置为0(表示不选中)。例如n=5, r=3时,初始数组为[1,1,1,0,0]。

  2. 利用prev_permutation:该函数生成当前序列的上一个字典序排列。由于初始序列是降序(1在前,0在后),通过不断获取前一个排列,可以得到所有不同的组合方式。

  3. 输出组合:对每个排列,输出值为1的位置对应的数字(i+1,因为题目从1开始计数)。

  4. 字典序输出prev_permutation按照降序生成排列,但输出时我们按索引升序读取,因此组合内部从小到大排列,整体组合也按字典序输出。

代码实现

#include<bits/stdc++.h>// 包含所有标准库usingnamespacestd;intn,r;// n: 总元素个数, r: 要选择的元素个数intmain(){cin>>n>>r;// 读取输入// 创建一个长度为n的vector,前r个元素为1,其余为0// 例如n=5,r=3时:a = [1,1,1,0,0]vector<int>a(n,0);for(inti=0;i<r;i++){a[i]=1;// 前r位标记为1(选中)}// 使用do-while确保至少执行一次,输出初始组合do{// 遍历数组a,输出所有标记为1的位置对应的数字for(inti=0;i<n;i++){if(a[i]){// 如果该位置被选中// 使用setw(3)设置场宽为3,输出i+1(题目要求数字从1开始)cout<<setw(3)<<i+1;}}cout<<endl;// 每个组合后换行}while(prev_permutation(a.begin(),a.end()));// prev_permutation生成当前序列的上一个字典序排列// 当序列变为完全升序时返回false,循环结束return0;}

功能分析

核心算法特点:
  1. 0-1位标记法:用1表示选择该位置数字,0表示不选择,直观高效。
  2. STL利用:使用prev_permutation自动生成所有排列,避免手动递归实现。
  3. 字典序保证:初始数组a为降序排列(1在前,0在后),prev_permutation按字典序递减生成排列,但输出时按索引升序读取,恰好得到组合的字典序递增输出。
执行流程:
  1. 初始化一个n位二进制序列,前r位为1。
  2. 输出当前1的位置对应的数字组合。
  3. 生成上一个排列(1向左移动)。
  4. 重复步骤2-3,直到所有1移到最右侧,排列变为升序。
示例演示(n=5, r=3):

初始: 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开始,因此输出时是i+1

完整系列资料,请查看专栏:《csp信奥赛C++标准模板库STL》

https://blog.csdn.net/weixin_66461496/category_13108077.html

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;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 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 21:34:03

模拟电路设计全流程:circuit simulator项目应用详解

模拟电路设计的“数字试验台”&#xff1a;如何用电路仿真器打造一次成功的芯片&#xff1f;你有没有经历过这样的时刻&#xff1f;辛辛苦苦画好了一个运放版图&#xff0c;流片回来却发现输出振荡&#xff1b;调试几天后发现问题出在补偿电容太小——而这个参数其实在仿真阶段…

作者头像 李华
网站建设 2026/3/13 22:38:00

scanner设备驱动架构深度剖析(Linux平台)

Linux平台下Scanner设备驱动架构的深度解析与实战指南你有没有遇到过这样的场景&#xff1a;一台老旧扫描仪插上Linux电脑后&#xff0c;系统毫无反应&#xff1b;或者在嵌入式设备上开发图像采集功能时&#xff0c;发现标准驱动根本不支持你的定制硬件&#xff1f;这些问题背后…

作者头像 李华
网站建设 2026/3/14 0:51:37

D2RML多开工具完整指南:轻松实现暗黑破坏神2重制版多账号游戏

D2RML多开工具完整指南&#xff1a;轻松实现暗黑破坏神2重制版多账号游戏 【免费下载链接】D2RML Diablo 2 Resurrected Multilauncher 项目地址: https://gitcode.com/gh_mirrors/d2/D2RML 想要在《暗黑破坏神2&#xff1a;重制版》中同时管理多个账号&#xff0c;体验…

作者头像 李华
网站建设 2026/3/14 6:51:01

BilibiliDown:解锁B站视频自由下载的完整解决方案

BilibiliDown&#xff1a;解锁B站视频自由下载的完整解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bi…

作者头像 李华
网站建设 2026/3/13 4:07:55

终极指南:使用dualra1n实现iOS设备双系统启动

终极指南&#xff1a;使用dualra1n实现iOS设备双系统启动 【免费下载链接】dualra1n this is a script to dualboot your iphone on ios 15 with 14 项目地址: https://gitcode.com/gh_mirrors/du/dualra1n 还在为无法同时体验不同iOS版本而烦恼吗&#xff1f;dualra1n项…

作者头像 李华
网站建设 2026/3/13 20:46:56

3D球体抽奖系统:重新定义企业活动的交互体验

你是否曾经在年会抽奖现场感受到这样的无奈&#xff1f;参与者对单调的抽奖界面毫无兴趣&#xff0c;组织者被繁琐的数据整理搞得焦头烂额&#xff0c;抽奖结果统计更是耗时耗力。这正是传统抽奖系统面临的三大核心痛点&#xff1a;视觉疲劳、效率低下、配置僵化。 【免费下载链…

作者头像 李华