//never use translation
#include<bits/stdc++.h>
using namespace std;
int k;
char a[20];//储存每个数的数值
int times[20];//mn次数
int timess[20];//mx次数
int len;
int mn;
int mx;
int kk,sum;
void solve()
{
    kk=0,sum=0;
    if(a[times[1]]==0)
        return;
    for(int i=1;i<=len;i++)
        timess[i]=times[i];//储存现在的数位情况,times因排序而发生递增
    for(int i=1;i<=len;i++)
    {
        sum=sum*10+a[times[i]];//记录按照数位变化而产生的数值
        if(timess[i]!=i)//该位置发生变动
        {
            for(int j=i+1;j<=len;j++)
            {
                if(timess[j]==i)//找到和前面发生变动的数字exchange的数位
                {
                    swap(timess[i],timess[j]);//交换以免在后续的查找中将交换的数位查找两次
                    kk++;//查找次数++
                    if(kk>k)
                        return;
                    break;//寻找下一个发生变动的数位
                }
            }
        }
    }
    if(kk>k)
        return;
    mx=max(mx,sum);
    mn=min(mn,sum);
    return;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%d",a+1,&k);
        len=strlen(a+1);
    if(len==10)
            printf("1000000000 1000000000\n");//剪枝
    else
    {
        memset(times,0,sizeof(times));
        memset(timess,0,sizeof(timess));
        for(int i=1;i<=len;i++)
        {
            a[i]-='0';
            times[a[i]]++;
            timess[a[i]]++;//计数
        }
        if(k>=len-1)//剪枝
        {
            for(int i=1;i<=9;i++)//第一位非零
            {
                if(times[i])
                {
                    printf("%d",i);
                    times[i]--;
                    break;
                }
            }
            for(int i=0;i<=9;i++)
            {
                while(times[i])//将所有数全部贪心输出
                {
                    printf("%d",i);
                    times[i]--;
                }
            }
            printf(" ");
            for(int i=9;i>=1;i--)//和上面反着来
            {
                if(timess[i])
                {
                    printf("%d",i);
                    timess[i]--;
                    break;
                }
            }
            for(int i=9;i>=0;i--)
            {
                while(timess[i])
                {
                    printf("%d",i);
                    timess[i]--;
                }
            }
            printf("\n");
        }
        else//还有一种利用暴力dfs的方法是最初的想法,听完讲解后觉得按照数位全排列技巧性高一点
        {
            mx=0,mn=1e10;//反向设定最值
            for(int i=1;i<=len;i++)
            {
                times[i]=i;//记录原始数位
            }
            do
            {
                solve();
            }while(next_permutation(times+1,times+1+len));//至少进行一次更新最值
            //全排列函数按照字典序寻找下一种情况,这里按照数位从最小的1~n开始枚举到n~1
            //prev_permutation按照字典序寻找上一种情况
            printf("%d %d\n",mn,mx);
        }
    }
    }
    return 0;
}

//遇见数字较大然而问题和单独的数有关时联想可否用数位思想解决,数位和数之间建立联系,数位处理问题时较为简单便利

2018杭电多校第五场1002(暴力DFS【数位】,剪枝)的更多相关文章

  1. 2018杭电多校第六场1009(DFS,思维)

    #include<bits/stdc++.h>using namespace std;int a[100010];char s[20];int zhiren[100010];vector& ...

  2. hdu6356 Glad You Came 杭电多校第五场 RMQ ST表(模板)

    Glad You Came Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  3. 2018杭电多校第三场1003(状态压缩DP)

    #include<bits/stdc++.h>using namespace std;const int mod =1e9+7;int dp[1<<10];int cnt[1& ...

  4. 2017杭电多校第五场11Rikka with Competition

    Rikka with Competition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  5. 2017杭电多校第五场Rikka with Subset

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. [2019杭电多校第五场][hdu6630]permutation 2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6630 题意为求出1-n,n个数的全排列中有多少种方案满足第一位为x,第n位为y,且相邻数字绝对值之差不 ...

  7. [2019杭电多校第五场][hdu6624]fraction

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6624 题意为求最小的b满足$a*b^{-1}\equiv x(modp)$. 把式子化简一下: $a\ ...

  8. [2019杭电多校第五场][hdu6629]string matching(扩展kmp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6629 题意求字符串的每个后缀与原串的最长公共前缀之和. 比赛时搞东搞西的,还搞了个后缀数组...队友一 ...

  9. [2019杭电多校第五场][hdu6628]permutation 1

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6628 题意为求字典序第k小的差异数组,差异数组p满足p[i]=a[i+1]-a[i]. 头铁的爆搜,因 ...

随机推荐

  1. Git之Eclipse提交项目到Github并实现多人协作

    一.Eclipece提交项目到Github 见  eclipse提交项目到github 二.利用github组织实现多人协作 1.新建组织: New organization

  2. (转)使用CUnit进行单元测试和覆盖率统计

    CUnit安装 如果能联网的话,直接 yum install CUnit-devel.x86_64 就完成安装了,注意要安装devel版本,这样才能找到头文件. 编写单元测试代码 CUnit的测试是单 ...

  3. Tomcat报错:HTTP Status 500 - Wrapper cannot find servlet class

    HTTP Status 500 - Wrapper cannot find servlet class com.servlet.servlet.RegServlet or a class it dep ...

  4. stl_list.h

    stl_list.h // Filename: stl_list.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...

  5. cocos2d-x 中 xml 文件读取

    实现类 CXmlParse 啥也不说了  直接上硬货  believe yourself   一看就明白 CXmlParse.h #ifndef __C_XML_PARSE__ #define __C ...

  6. 【遍历二叉树】08判断两个二叉树是否相同【Same Tree】

    迭代版本用的是二叉树的DFS,中的root->right->left +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  7. photonView 空指针异常

    1.OBJ上要有PhotonView 脚本 2.PhotonNetwork.Instantiate方法初始化出来OBJ OBJ 预制体要放在Resources文件夹下 PhotonNetwork.In ...

  8. 在oracle中,select语句查询字段中非纯数字值

    最近,将原来的数字符字段转换为数字时,总报错误:无效数字. 如何找出其中哪些是非数字字符的记录?比较麻烦的事.下面是用Oracle DB自带的函数translate可以找出来的 1.创建测试表 Cre ...

  9. bzoj 2096 [POI2004]ZAW——二进制枚举

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 可以把直接相连的点分成  从1点出的一部分  和  走向1点的一部分.多起点最短路就和 ...

  10. 广度优先搜索(BFS)

    广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法.简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点 ...