news 2026/7/2 1:12:57

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

作者头像

张小明

前端开发工程师

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

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

next_permutation实践

题目描述

人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。

火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1 , 2 , 3 , ⋯ 1,2,3,\cdots1,2,3,。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。

一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为1 , 2 , 3 , 4 1,2,3,41,2,3,45 55,当它们按正常顺序排列时,形成了5 55位数12345 1234512345,当你交换无名指和小指的位置时,会形成5 55位数12354 1235412354,当你把五个手指的顺序完全颠倒时,会形成54321 5432154321,在所有能够形成的120 1201205 55位数中,12345 1234512345最小,它表示1 1112354 1235412354第二小,它表示2 2254321 5432154321最大,它表示120 120120。下表展示了只有3 33根手指时能够形成的6 663 33位数和它们代表的数字:

三位数代表的数字
123 1231231 11
132 1321322 22
213 2132133 33
231 2312314 44
312 3123125 55
321 3213216 66

现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。

输入格式

共三行。
第一行一个正整数N NN,表示火星人手指的数目(1 ≤ N ≤ 10000 1 \le N \le 100001N10000)。
第二行是一个正整数M MM,表示要加上去的小整数(1 ≤ M ≤ 100 1 \le M \le 1001M100)。
下一行是1 11N NNN NN个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。

输出格式

N NN个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。

输入输出样例 1
输入 1
5 3 1 2 3 4 5
输出 1
1 2 4 5 3
说明/提示

对于30 % 30\%30%的数据,N ≤ 15 N \le 15N15

对于60 % 60\%60%的数据,N ≤ 50 N \le 50N50

对于100 % 100\%100%的数据,N ≤ 10000 N \le 10000N10000

题目分析

这道题的核心是理解火星人的计数方式:火星人用手指排列的顺序来表示数字,每个不同的排列对应一个数字,排列按字典序从小到大排序。给定当前排列和一个正整数M,要求找到当前排列之后的第M个排列。

解题思路

核心算法

使用C++ STL中的next_permutation函数,该函数会按照字典序生成当前排列的下一个排列。

算法步骤
  1. 读入火星人手指数量N和需要加的整数M
  2. 读入当前手指排列顺序
  3. 调用next_permutation函数M次,得到新的排列
  4. 输出新的排列

代码实现

#include<bits/stdc++.h>usingnamespacestd;intn,m,x;// n:手指数量,m:要加的数字,x:临时变量用于输入intmain(){cin>>n>>m;// 读入手指数量n和要加的数字mvector<int>a;// 使用vector存储手指的排列// 读入当前排列for(inti=1;i<=n;i++){cin>>x;a.push_back(x);// 将每个手指编号添加到vector中}// 连续调用m次next_permutation,得到当前排列之后的第m个排列while(m--){next_permutation(a.begin(),a.end());// 生成下一个排列}// 输出结果排列for(inti=0;i<n;i++){cout<<a[i]<<" ";// 输出每个数字,用空格分隔}return0;}

功能分析

输入处理
  • 第一行:手指数量N
  • 第二行:要加的数字M
  • 第三行:当前排列(1~N的一个排列)
核心功能
  1. 排列生成:使用next_permutation函数生成下一个排列

    • 这个函数会修改容器中的元素顺序,使其变为字典序中的下一个排列
    • 如果当前排列已经是最后一个排列,函数会返回false并将序列重置为第一个排列(但本题保证结果不会超出范围)
  2. 迭代M次:相当于将当前排列对应的数字加上M

复杂度分析

时间复杂度
  • next_permutation函数的时间复杂度为O(N)
  • 需要执行M次,因此总时间复杂度为O(M×N)
  • 在题目限制下(N≤10000,M≤100),最坏情况为100×10000=1e6次操作,可以接受
空间复杂度
  • 使用vector存储排列,空间复杂度为O(N)

示例解析

以样例为例:

输入: 5 3 1 2 3 4 5
  • 初始排列:12345(对应数字1)
  • 加3后:应该是第4个排列(1+3=4)
  • 所有5位数排列按字典序:
    1. 12345
    2. 12354
    3. 12435
    4. 12453(对应输出1 2 4 5 3)

完整系列资料,请查看专栏:《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/6/26 14:23:44

基于python的贫困地区儿童救助系统_8s0gs

目录已开发项目效果实现截图关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 ,本人源头供货商 基于python的贫困地区儿童救助系统_8…

作者头像 李华
网站建设 2026/6/28 19:57:07

使用Conda创建独立PyTorch环境:避免依赖冲突的最佳实践

使用Conda创建独立PyTorch环境&#xff1a;避免依赖冲突的最佳实践 在深度学习项目日益增多的今天&#xff0c;你是否也遇到过这样的问题&#xff1a;刚跑通一个基于 PyTorch 1.12 的图像分类模型&#xff0c;结果另一个 NLP 项目要求升级到 PyTorch 2.7&#xff0c;一升级&am…

作者头像 李华
网站建设 2026/6/30 23:46:13

PyTorch-CUDA-v2.7镜像在室内导航系统中的角色

PyTorch-CUDA-v2.7镜像在室内导航系统中的角色 如今&#xff0c;智能机器人穿梭于医院走廊、商场中庭或仓储车间的场景已不再罕见。这些设备之所以能“看得清”“走得稳”&#xff0c;离不开背后强大的环境感知能力——而这种能力的核心&#xff0c;正是运行在高效计算平台上的…

作者头像 李华
网站建设 2026/7/1 1:12:04

Web安全之SQL注入-CSRF-XSS

聚焦三大高危漏洞&#xff1a;SQL 注入、CSRF、XSS1. SQL 注入&#xff08;SQL Injection&#xff09; 攻击原理 攻击者通过在用户输入中嵌入恶意 SQL 片段&#xff0c;绕过应用逻辑&#xff0c;直接操作数据库。 示例&#xff08;危险代码&#xff09;&#xff1a; # 危险&…

作者头像 李华
网站建设 2026/7/1 21:15:07

PyTorch-CUDA镜像能否用于电梯智能调度

PyTorch-CUDA镜像能否用于电梯智能调度 在现代高层建筑中&#xff0c;电梯不再只是简单的垂直运输工具——它正逐渐演变为一个需要实时决策、动态响应的复杂系统。每天早晚高峰时&#xff0c;人们挤在大厅等待电梯&#xff0c;而控制系统却仍在用几十年前的“就近响应”逻辑派梯…

作者头像 李华
网站建设 2026/6/26 14:26:49

从GitHub克隆项目后如何激活PyTorch虚拟环境?

从GitHub克隆项目后如何激活PyTorch虚拟环境&#xff1f; 在深度学习项目开发中&#xff0c;你是否曾遇到这样的场景&#xff1a;刚从 GitHub 克隆了一个热门的 PyTorch 项目&#xff0c;满怀期待地运行 python train.py&#xff0c;结果却抛出一连串错误——“No module named…

作者头像 李华