题目
Permutation
Accept:217 Submit:706
Time Limit:1000MS Memory Limit:65536KB
Description
We all know that , when there are n positive integers (namely 1…n) , we can use these n integers to construct n! kinds of permutations . Sort these permutations in lexicographic order . For example , when n = 3 , we can permute 1 2 3,1 3 2,2 1 3, 2 3 1, 3 1 2 , 3 2 1 these 6 kinds of permutations.
Now , we want to know , with the given permutation , calculate the next k permutation . If the permutation is the last permutation in order , its next permutation is the first permutation , namely 1 2 3 … n.
e.g. when n = 3 , k = 2 , giving the permutation 2 3 1 , thus its next 1 permutation is 3 1 2 , its next 2 permutation is 3 2 1 , so the answer is 3 2 1 .
Input
The first line is a positive integer m , indicating the number of test cases . Then m test cases . In every test case , the first line is 2 positive integers n (1 <= n < 1024) and k (1 <= k <= 64) ; the second line are n positive integers , which is one of the “ 1 2 3 … n” s’ permutation.
Output
For each test case , print one line , n numbers , with spaces separating every number , indicating the given permutation ‘s next k permutation.
Sample Input
3
3 1
2 3 1
3 1
3 2 1
10 2
1 2 3 4 5 6 7 8 9 10
Sample Output
3 1 2
1 2 3
1 2 3 4 5 6 7 9 8 10
/*************************************************************************
> File Name: next_permutation.c
> Author: narutolby
> Mail:willianlby@yahoo.cn
> Created Time: 2013年01月08日 星期二 09时26分34秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int num[1024];
typedef struct test1{
int len;
int nextP;
int num[1024];
}Test;
void printfArray(int num[],int len){
int i=0;
for(;i<=len;i++){
printf("%d",num[i]);
if(i<len){
printf(" ");
}
}
printf("\n");
}
void swap(int num[],int i,int j){
int t=0;
t=num[i];
num[i]=num[j];
num[j]= t;
}
void reverse(int num[],int start,int end){
for(;start<end;start++,end--){
swap(num,start,end);
}
}
void next_permutation(int num[],int len,int k){
int j=len;
int loop = 0;
while(j>0){
if(num[j]>num[j-1]){
int minMax = num[j],n=j+1,minMaxIndex=j;
for(;n<=len;n++){
if(num[n]<minMax && num[n]>num[j-1]){
minMax = num[n];
minMaxIndex = n;
}
}
swap(num,j-1,minMaxIndex);
int f=j,g=len;
reverse(num,f,g);
loop++;
if(loop==k){
printfArray(num,len);
break;
}
j=len;
}else{
j--;
}
}
if(loop<k){
reverse(num,0,len);
loop++;
if(loop==k){
printfArray(num,len);
}else{
next_permutation(num,len,k-loop);
}
}
}
int main(){
int times,time=0;
scanf("%d",×);
Test *testArray[times] ;
// printf("times:%d\n",times);
for(;time<times;time++){
// printf("current time:%d\n",time);
Test *test = (Test*)malloc(sizeof(Test));
scanf("%d %d",&test->len,&test->nextP);
// printf("%d %d\n",test->len,test->nextP);
int m =0;
for(;m<test->len;m++){
scanf("%d",&test->num[m]) ;
// printf("%d ",test->num[m]);
}
// printf("\n");
testArray[time] = test;
}
// printf("end\n");
time=0;
for(;time<times;time++){
Test *t1 = testArray[time];
next_permutation(t1->num,t1->len-1,t1->nextP);
free(t1);
}
return 0;
}
解题思路
本题的输入为int型数组array和int型k值,以当前数组开始,求第k个按字典顺序的全排列输出。
解题步骤
所谓字典顺序,就是数组之间会从索引0开始,依次比较,如果相同,则比较下一个元素,直到遇到不同大小的元素为止,大元素所在的数组字典顺序在小元素所在数组的后面,依次类推。
回到本题,如输入数组1,2,3,4,5为按照字典顺序的第一个,5,4,3,2,1为按照字典顺序的最后一个,也就是数字越大的数字所在的位置越靠前,所在的字典顺序越靠后。
按照这个思路,所以我们的解题步骤如下:
(1)从后向前遍历数组,记录第一个当前元素大于前一个元素的位置,记录为i;
(2)从第i个元素开始,向后搜索大于i-1最小的元素,记录为j,交换i和j的元素值,并将从第i个元素开始以后的元素倒置。
经过以上两个步骤就求出了当前数组在字典顺序下的下一个全排列。
同理,可求出第k个。
分享到:
相关推荐
实验室安全试题&答案 北邮 题目有重复的
北邮机试往年试题汇总是北邮BUPT OJ平台上的一个题库,收录了从2010年到2014年的所有机试往年题。该题库的内容涵盖了计算机科学和技术的多个领域,包括算法、数据结构、计算机网络、操作系统、数据库等。 算法方面...
《BUPT信号与系统2006真题》是一份重要的教育资源,对于准备北京邮电大学(BUPT)考研的学生来说,无疑是宝贵的复习材料。"信号与系统"是电子工程、通信工程、自动化等专业的重要课程,它涵盖了信号的基本概念、系统...
BUPT信安数字内容安全期末试题
总结来说,"BUPT计算导论OJ上机题参考源代码 + 可执行文件整合资源包”是计算机学院大一新生宝贵的教育资源,它涵盖了C语言基础、算法设计与分析、编程实践等多个方面,对于初学者的成长至关重要。通过对这些资料的...
这个压缩包包含了BUPT(北京邮电大学)学生在学习离散数学时的作业、课堂讲义、习题解答以及考试试卷,提供了全面的学习资源。 1. **集合论**:集合论是离散数学的基础,主要研究集合的性质和操作。文件可能包括了...
为了帮助学生们更好地适应这种新环境,BUPT打铃器应运而生,它通过播放原汁原味的BUPT上下课铃声,为学生们创造出一个仿佛回到校园的学习环境。 北京邮电大学(BUPT)是中国著名的理工科高校,其校园生活丰富多彩,...
在第二章中,你可能会学习到图数据库的基本概念,例如如何定义节点、边和属性,以及如何使用图遍历算法进行查询。图数据库的代表有Neo4j和JanusGraph等,它们在实际应用中展现出强大的查询性能和灵活性。 接着是...
5. 计算机网络:网络模型、网络传输、路由选择、网络安全策略等。 6. 软件工程:软件开发流程、需求分析、设计模式、测试方法等。 7. 人工智能与机器学习:基础理论、神经网络、深度学习、算法实现等。 8. 计算机...
2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023...
在这个阶段,学生将学习如何使用ER图来表示现实世界中的实体及其关系,并转化为关系表,同时理解第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的概念,确保数据库设计的规范性和效率。 实验二:重点在于SQL...
7. "第5章+进程控制与进程间通信-v2.pptx" 关注的是进程管理和进程间的通信机制,如fork、exec、pipe、socket等,这是理解多任务处理和系统级编程的关键。 综合以上内容,这门课程全面覆盖了Linux基础知识,包括...
在本项目“BUPT软件工程分布式温控系统”中,我们看到了一个基于Python编程语言实现的系统,结合了PyQT5图形用户界面库和MySQL数据库技术。 1. **Python编程**:Python是一种高级编程语言,以其简洁的语法和强大的...
工数是我唯一一门挂掉的科目,大家一定要好好刷题啊! 补考和正式考试同等难度,请不要掉以轻心! 本合集包括: 2013——2014 学年第二学期 《工程数学》期末...2020——2021 学年第一学期《工程数学》考试试题(补考)
在本实验中,我们主要关注的是“BUPT大二下,计网课程设计,DNS服务器实验”。这个项目涉及到了计算机网络中的一个重要组件——域名系统(DNS),以及与之相关的编程技术,如C++。DNS是互联网上的一个关键服务,它...
判断题和单项选择题主要考察学生对软件工程基础概念的理解程度,而简答题和应用题则更进一步,要求学生能够运用所学知识对实际问题进行分析和解决,体现了较高的综合运用能力。 通过分析这些试题,我们可以看到,...
《电子电路基础》是大学电气工程及其自动化、信息与通信工程等专业的重要基础课程,它为学生深入理解和应用电路...在学习过程中,建议配合教材、课件,以及做适量的练习题,以确保对电子电路基础有全面且深入的理解。
本文以北京邮电大学(BUPT)计算机系统基础课程中的实验为例,详细介绍如何理解和应对缓冲区溢出攻击。 ### 一、实验目的 实验的主要目的是让学生了解C语言程序在机器层面上的表示,掌握GDB调试器的使用,理解x86-...
在本压缩包“八皇后等java作业-bupt”中,主要包含了北邮(BUPU)计算机科学与技术专业的学生进行Java编程学习的一些作业。这些作业涵盖了基础的编程概念、多态性应用以及一个经典的算法问题——八皇后问题。下面...
在本篇“BUPT物理实验报告”中,涵盖了多个重要的物理学和电子学概念,主要涉及光学、力学和电磁学领域。这些实验不仅锻炼了学生的动手能力,也加深了他们对理论知识的理解。以下是对每个实验主题的详细阐述: 1. ...