news 2026/4/15 15:53:49

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/4/13 18:16:55

Anaconda配置PyTorch环境时内存溢出怎么办?

Anaconda配置PyTorch环境时内存溢出怎么办&#xff1f; 在深度学习项目开发中&#xff0c;你是否曾遇到这样的场景&#xff1a;刚搭建好的Anaconda环境&#xff0c;一运行PyTorch训练脚本就报错“CUDA out of memory”&#xff1f;明明显卡有24GB显存&#xff0c;模型也不算特…

作者头像 李华
网站建设 2026/3/28 11:37:11

PyTorch-CUDA镜像能否用于文物数字化修复

PyTorch-CUDA镜像能否用于文物数字化修复 在敦煌莫高窟的数字化保护项目中&#xff0c;研究人员面对一幅120008000像素的唐代壁画扫描图——表面剥落、颜料褪色、裂缝纵横。传统人工修复需要数月时间&#xff0c;而团队希望借助AI实现快速补全。此时&#xff0c;一个关键问题浮…

作者头像 李华
网站建设 2026/4/1 23:10:55

PyTorch-CUDA镜像对城市交通流量预测的支持

PyTorch-CUDA镜像如何重塑城市交通流量预测的开发范式 在一座千万级人口的城市中&#xff0c;每分钟都有数以万计的车辆穿梭于主干道与支路之间。交通指挥中心的大屏上&#xff0c;不断跳动的车流数据背后&#xff0c;是成百上千个传感器、摄像头和地磁线圈实时回传的信息洪流。…

作者头像 李华
网站建设 2026/4/14 17:50:11

PyTorch-CUDA-v2.7镜像在森林火灾预警中的潜力

PyTorch-CUDA-v2.7镜像在森林火灾预警中的潜力 当山林边缘的摄像头捕捉到一丝异常烟雾&#xff0c;系统必须在几秒内判断&#xff1a;是炊烟&#xff1f;是云雾&#xff1f;还是正在蔓延的火情&#xff1f;在森林火灾预警这场与时间赛跑的战役中&#xff0c;每一毫秒都至关重要…

作者头像 李华
网站建设 2026/4/2 6:57:23

MOVE_CORRESPONDING_ITAB

使用MOVE-CORRESPONDING时可以通过KEEPING TARGET LINES实现追加而不是覆盖。 SAP 的实例DemoREPORT demo_move_corresponding_itab.CLASS demo DEFINITION.PUBLIC SECTION.CLASS-METHODS main.PRIVATE SECTION.TYPES:c3 TYPE c LENGTH 3,BEGIN OF iline1,col1 TYPE c3,col2 TY…

作者头像 李华
网站建设 2026/4/15 14:10:43

ue入门项目:项目设置

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录项目设置1.创建项目2.创建地图3.创建地图的相关配置1.创建项目只需要按如图所示点击创建即可2.创建地图1.文件-新建关卡-选择basic即可创建2.创建地图后必须点击保存才生效3.创建地图的相关配置玩家点击运行时 地图运…

作者头像 李华