求助 长度为n的第k个排列

B. 长度为n的第k个排列

Problem ID: 7977

Contest ID: 6305

必做题

时间限制:0.2s 空间限制:32M

题目描述:

求 1,2,3,…,n 的字典序第 k 小的排列。

输入格式:

一行两个正整数 n,k

输出格式:

一行表示答案。

样例输入:

3 3

样例输出:

2 1 3

约定:

1≤n≤10, 1≤k≤100
哪位大lao帮我看一下(必给解决方案)

你准备一个变量来看是第几个排列了然后进行n的全排列当满足条件并且是第k个的时候输出

#include<bits/stdc++.h>
using namespace std;
int n,m,a[20],tt=0;
int b[110][20]; 
void fun(int x,int y){
	if(x==n+1){
		if(x==m){
			for(int i=0;i<m;i++){
				b[tt++][i]=a[i];
			}
		}return ;
	}a[x]=y;
	fun(x+1,y+1);
	fun(x,y+1);
}int main(){
	scanf("%d%d",&n,&m);
	fun(0,1);
	for(int i=0;i<m;i++){
		printf("%d ",b[m][i]);
	}return 0;
}

那我这代码该怎么改(调了30分钟)

我感觉完全错误

的确玩全错误
你dfs怎么写的

可是k>n啊
k<100,n<10
哪来的第k小的数啊

是第k个排列

n的全排列个数远不止n个

明白了,谢谢

void dfs(int x)
{
	if(x==n+1)
	{
		t++;
		if(t==m) for(int i=1;i<=n;++i) printf("%d ",a[i]);
		return;
	}
	for(int i=1;i<=n;++i)
	if(b[i]==0)
	{
		b[i]=1;
		a[x]=i;
		dfs(x+1);
		b[i]=0;
	}
}

这是我的dfs你可以参考一下

谢谢

噢噢
看错了
那没事

你算法几呀这都能看错

我就是单纯的眼瞎
没事了

我就问你算法几

不知道

你怎么可能不知道

image
自己看,我真不知道

我记得算法三最后才学到动态规划吧

你不会是图灵班的吧