zoukankan      html  css  js  c++  java
  • permutation 1 多校第五场

    Problem Description
     
    A sequence of length n is called a permutation if and only if it's composed of the first n positive integers and each number appears exactly once.

    Here we define the "difference sequence" of a permutation p1,p2,,pn as p2p1,p3p2,,pnpn1. In other words, the length of the difference sequence is n1 and the i-th term is pi+1pi

    Now, you are given two integers N,K. Please find the permutation with length N such that the difference sequence of which is the K-th lexicographically smallest among all difference sequences of all permutations of length N.
     
    Input
    The first line contains one integer T indicating that there are T tests.

    Each test consists of two integers N,K in a single line.

    1T40

    2N20

    1Kmin(104,N!)
     
    Output
    For each test, please output N integers in a single line. Those N integers represent a permutation of 1 to N, and its difference sequence is the K-th lexicographically smallest.
     
    Sample Input
    7
    3 1
    3 2
    3 3
    3 4
    3 5
    3 6
    20 10000
     
    Sample Output
    3 1 2
    3 2 1
    2 1 3
    2 3 1
    1 2 3
    1 3 2
    20 1 2 3 4 5 6 7 8 9 10 11 13 19 18 14 16 15 17 12
     
    Source
     
    题意:给你n和k  求n的全排列 使得ai+1 - ai (1<=i<=n-1)的字典序是第k小
    思路:因为k的范围最大是10000 (8!=40320) 7!=5040
    所以当n=9时 第一位取9 后面几位全排列 即8!种排列方法(k最大10000次不会超时)
    所以分开处理 情况1:n<=8的   这种的要全部算出来 然后sort
    之后就是>=9的  这种就直接第一位时n  之后的n-1位全排列
     
    代码:
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    struct ydw{
        int d[22],dd[22];
    }xy[50005];
    int n;
    bool cmp(ydw u,ydw v)
    {
        for(int i=1;i<n;i++)
        {
            if(u.dd[i]!=v.dd[i])return u.dd[i]<v.dd[i];
        }
    }
    int main()
    {
        int i,j,m,k;
        int t;scanf("%d",&t);
        int a[25];
        while(t--)
        {
             scanf("%d%d",&n,&k);
             for(i=1;i<=n;i++)a[i]=i;
             if(n<=8)
             {
                 int k2=1;
                 for(i=1;i<=n;i++)
                 {
                     xy[k2].d[i]=a[i];
                 }
                 for(i=2;i<=n;i++)
                 {
                     xy[k2].dd[i-1]=a[i]-a[i-1];
                 }
                 k2++;
                 while(next_permutation(a+1,a+1+n))
                 {
                     for(i=1;i<=n;i++)
                         xy[k2].d[i]=a[i];
                     for(i=2;i<=n;i++)
                        xy[k2].dd[i-1]=a[i]-a[i-1];
                     k2++;
                 }
                 sort(xy+1,xy+k2,cmp);
                 for(i=1;i<n;i++)
                 {
                     cout<<xy[k].d[i]<<" ";
                 }
                 cout<<xy[k].d[n]<<endl;
                 continue;
             }
             //n>9的情况
             int k1=0;
             int b[30];
             for(i=1;i<n;i++)b[k1++]=i;
             cout<<n<<" ";//第一位
             if(k==1)
             {
                 for(i=0;i<k1-1;i++)cout<<b[i]<<" ";
                 cout<<b[k1-1]<<endl;
                 continue;
             }
             int ans=1;
             while(next_permutation(b,b+k1))
             {
                 ans++;
                 if(ans==k)
                 {
                     for(i=0;i<k1-1;i++)cout<<b[i]<<" ";
                     cout<<b[k1-1]<<endl;
                     break;
                 }
             }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Apache与Nginx的优缺点比较
    [PHP基础]有关isset empty 函数的面试题
    PHP求解一个值是否为质数
    15个魔术方法的总结
    对象在类中的存储方式有哪些?
    cookie大小
    Tp3.2 和 Tp5.0之间的区别
    经典的面试题,(这是著名的约瑟夫环问题)
    怎么计算数据库有多大的数据量
    [置顶] 实用电子电路设计丛书
  • 原文地址:https://www.cnblogs.com/ydw--/p/11326897.html
Copyright © 2011-2022 走看看