zoukankan      html  css  js  c++  java
  • HDU 1027 Ignatius and the Princess II 排列生成

    解题报告:1-n这n个数,有n!中不同的排列,将这n!个数列按照字典序排序,输出第m个数列。

    第一次TLE了,没注意到题目上的n和m的范围,n的范围是小于1000的,然后m的范围是小于10000的,很明显,如果暴力枚举的话,时间复杂度就是O(n*m),为10^7,所以可以通过。这题其实就是一个排列生成的题,排列生成有多种方法,这题的关键是当找到答案的时候,要及时退出暴力过程,要不然肯定TLE。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 int num,n,m,visit[1005],flag;
     7 
     8 void dfs(int* A,int deep)
     9 {
    10     if(flag) return ;
    11     if(deep - 1 == n)
    12     {
    13         num++;
    14         if(num == m)
    15         {
    16             for(int i = 1;i<=n;++i)
    17             printf(i==1? "%d":" %d",A[i]);
    18             flag = 1;
    19             return ;
    20         }
    21     }
    22     else
    23     {
    24         for(int i = 1;i<=n;++i)
    25         if(!visit[i])
    26         {
    27             A[deep] = i;
    28             visit[i] = 1;
    29             dfs(A,deep+1);
    30             visit[i] = 0;
    31         }
    32     }
    33 }
    34 
    35 int main() 
    36 {
    37     int A[1005];
    38     while(scanf("%d%d",&n,&m)!=EOF)
    39     {
    40         num = flag = 0;
    41         memset(visit,0,sizeof(visit));
    42         dfs(A,1);
    43         printf("
    ");
    44     }
    45     return 0;
    46 }
    47         
    View Code
  • 相关阅读:
    205. Isomorphic Strings
    8 旋转数组的最小数字
    303. Range Sum Query
    70. Climbing Stairs
    HDU 5971 Wrestling Match (二分图)
    URAL 2019 Pair: normal and paranormal (STL栈)
    URAL 2021 Scarily interesting! (贪心+题意)
    URAL 2018 The Debut Album (DP)
    HDU 5236 Article (概率DP+贪心)
    HDU 5241 Friends (大数)
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3294083.html
Copyright © 2011-2022 走看看