zhengzhisheng6 2022-02-16 13:12 采纳率: 91.7%
浏览 34
已结题

TLE帮助改正一下吧

我们将所有的排列按照如下规则进行排序:

如果长度不同,那么长度小的排前面;否则,字典序小的排前面。

请找到按照这个规则排序得到的第n 个排列。
输入格式:
一个正整数表示 n。
输出格式
一个序列表示答案。
样例输入1:
6
样例输出1:
2 1 3
这样是TLE,望帮忙改正

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
 
using namespace std;
int jiecheng(int x){
    int y=1; 
    for(int i=1;i<=x;i++){
        y*=x;
    }
    return y;
}
int a[1000]={0};//保存数列的数组,默认每个位置都是0
int  book[1000]={0};//记录一个数有没有在数组里
int n,x=-1;//1~n
int k;
void A(int pos)//向a[pos]填数
{
    if(pos==k+1)//递归边界
    {    x++;
    if(x==n){
        for(int i=1;i<=k;i++)//输出数列
            printf("%d ",a[i]);
        printf("\n");
     }
        return;
    }
    for(int i=1;i<=k;i++)
    {
        if(book[i]==0)//如果i没有在数组里面
        {
            a[pos]=i;
            book[i]=1;
            A(pos+1);//向a[pos+1]填数
            a[pos]=0;
            book[i]=0;//收回,试下一个数
        }
    }
}
int main()
{
   // freopen("in.txt","r",stdin);
     int s=0;
    scanf("%d",&n);
    for(k=0;k<n;k++){
        A(1);
    }
 
    return 0;
}
  • 写回答

1条回答 默认 最新

  • zhengzhisheng6 2022-02-16 19:40
    关注

    其实只要把k<n改一下就好了

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
       
    using namespace std;
    int jc[11]={1,2,6,24,120,720,5040,40320,362800,3628800};
    int a[1000]={0};//保存数列的数组,默认每个位置都是0
    int  book[1000]={0};//记录一个数有没有在数组里
    int n,x=-1;//1~n
    int k;
    void A(int pos)//向a[pos]填数
    {
        if(pos==k+1)//递归边界
        {   x++;
        if(x==n){
            for(int i=1;i<=k;i++)//输出数列
                printf("%d ",a[i]);
            printf("\n");
        }
            return;
        }
        for(int i=1;i<=k;i++)
        {
            if(book[i]==0)//如果i没有在数组里面
            {
                a[pos]=i;
                book[i]=1;
                A(pos+1);//向a[pos+1]填数
                a[pos]=0;
                book[i]=0;//收回,试下一个数
            }
        }
    }
    int main()
    {
        int s=0;
        scanf("%d",&n);
        int c;
        for(int i=0;i<9;i++){
            if(n<=jc[i]){
                c=i+1;
                break;
            }
        }
        for(k=0;k<=c;k++){
            A(1);
        }
       
        return 0;
    }
    
    

    确定它在第几个阶乘就好,打个表而已

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月24日
  • 已采纳回答 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看