`

bupt boj 第五题

    博客分类:
  • acm
 
阅读更多
题目
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",&times);
	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实验室安全试题&答案

    实验室安全试题&答案 北邮 题目有重复的

    北邮机试往年试题汇总 | 北邮复试 | BUPT OJ

    北邮机试往年试题汇总是北邮BUPT OJ平台上的一个题库,收录了从2010年到2014年的所有机试往年题。该题库的内容涵盖了计算机科学和技术的多个领域,包括算法、数据结构、计算机网络、操作系统、数据库等。 算法方面...

    BUPT信号与系统2006真题

    《BUPT信号与系统2006真题》是一份重要的教育资源,对于准备北京邮电大学(BUPT)考研的学生来说,无疑是宝贵的复习材料。"信号与系统"是电子工程、通信工程、自动化等专业的重要课程,它涵盖了信号的基本概念、系统...

    BUPT信安数字内容安全期末试题

    BUPT信安数字内容安全期末试题

    [BUPT]计算导论OJ上机题参考源代码 + 可执行文件整合资源包(计算机学院 - 大一上).zip

    总结来说,"BUPT计算导论OJ上机题参考源代码 + 可执行文件整合资源包”是计算机学院大一新生宝贵的教育资源,它涵盖了C语言基础、算法设计与分析、编程实践等多个方面,对于初学者的成长至关重要。通过对这些资料的...

    BUPT离散数学作业以及ppt讲义以及课堂习题

    这个压缩包包含了BUPT(北京邮电大学)学生在学习离散数学时的作业、课堂讲义、习题解答以及考试试卷,提供了全面的学习资源。 1. **集合论**:集合论是离散数学的基础,主要研究集合的性质和操作。文件可能包括了...

    BUPT 打铃器 原音乐

    为了帮助学生们更好地适应这种新环境,BUPT打铃器应运而生,它通过播放原汁原味的BUPT上下课铃声,为学生们创造出一个仿佛回到校园的学习环境。 北京邮电大学(BUPT)是中国著名的理工科高校,其校园生活丰富多彩,...

    BUPT NoSQL数据库

    在第二章中,你可能会学习到图数据库的基本概念,例如如何定义节点、边和属性,以及如何使用图遍历算法进行查询。图数据库的代表有Neo4j和JanusGraph等,它们在实际应用中展现出强大的查询性能和灵活性。 接着是...

    BUPT计算机学院大雾,期末试卷,ppt

    5. 计算机网络:网络模型、网络传输、路由选择、网络安全策略等。 6. 软件工程:软件开发流程、需求分析、设计模式、测试方法等。 7. 人工智能与机器学习:基础理论、神经网络、深度学习、算法实现等。 8. 计算机...

    2023bupt大创遥感语义分割.rar

    2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023bupt大创遥感语义分割.rar2023...

    BUPT数据库实验大三

    在这个阶段,学生将学习如何使用ER图来表示现实世界中的实体及其关系,并转化为关系表,同时理解第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的概念,确保数据库设计的规范性和效率。 实验二:重点在于SQL...

    BUPT计算机大三Linux实验1-4

    7. "第5章+进程控制与进程间通信-v2.pptx" 关注的是进程管理和进程间的通信机制,如fork、exec、pipe、socket等,这是理解多任务处理和系统级编程的关键。 综合以上内容,这门课程全面覆盖了Linux基础知识,包括...

    BUPT软件工程分布式温控系统

    在本项目“BUPT软件工程分布式温控系统”中,我们看到了一个基于Python编程语言实现的系统,结合了PyQT5图形用户界面库和MySQL数据库技术。 1. **Python编程**:Python是一种高级编程语言,以其简洁的语法和强大的...

    BUPT《工程数学》期末试题

    工数是我唯一一门挂掉的科目,大家一定要好好刷题啊! 补考和正式考试同等难度,请不要掉以轻心! 本合集包括: 2013——2014 学年第二学期 《工程数学》期末...2020——2021 学年第一学期《工程数学》考试试题(补考)

    BUPT大二下,计网课程设计,DNS服务器实验.zip

    在本实验中,我们主要关注的是“BUPT大二下,计网课程设计,DNS服务器实验”。这个项目涉及到了计算机网络中的一个重要组件——域名系统(DNS),以及与之相关的编程技术,如C++。DNS是互联网上的一个关键服务,它...

    2010-2011软工期中试题_有答案(BUpt)

    判断题和单项选择题主要考察学生对软件工程基础概念的理解程度,而简答题和应用题则更进一步,要求学生能够运用所学知识对实际问题进行分析和解决,体现了较高的综合运用能力。 通过分析这些试题,我们可以看到,...

    BUPT《电子电路基础》2020春期末试题

    《电子电路基础》是大学电气工程及其自动化、信息与通信工程等专业的重要基础课程,它为学生深入理解和应用电路...在学习过程中,建议配合教材、课件,以及做适量的练习题,以确保对电子电路基础有全面且深入的理解。

    【BUPT计算机系统基础】CSAPP-lab3-缓冲区溢出攻击.docx

    本文以北京邮电大学(BUPT)计算机系统基础课程中的实验为例,详细介绍如何理解和应对缓冲区溢出攻击。 ### 一、实验目的 实验的主要目的是让学生了解C语言程序在机器层面上的表示,掌握GDB调试器的使用,理解x86-...

    八皇后等java作业-bupt

    在本压缩包“八皇后等java作业-bupt”中,主要包含了北邮(BUPU)计算机科学与技术专业的学生进行Java编程学习的一些作业。这些作业涵盖了基础的编程概念、多态性应用以及一个经典的算法问题——八皇后问题。下面...

    BUPT物理实验报告

    在本篇“BUPT物理实验报告”中,涵盖了多个重要的物理学和电子学概念,主要涉及光学、力学和电磁学领域。这些实验不仅锻炼了学生的动手能力,也加深了他们对理论知识的理解。以下是对每个实验主题的详细阐述: 1. ...

Global site tag (gtag.js) - Google Analytics