zoukankan      html  css  js  c++  java
  • 火柴棍

    火柴棍

    Time Limit:   1000MS       Memory Limit:   65535KB
    Submissions:   82       Accepted:   21
    Description

    火柴棍可以拼成10进制的数字,如图所示:

    现在,gogo给你个n个火柴棍,要求你输出最小能拼成的数字和最大能拼成的数字。

    Input

    第一行输入一个整数T:T组测试数据(T<100)

    每行输入一个n (2 ≤ n ≤ 100): 表示你有的火柴棍数。

    Output

    最小能拼成的数字和最大能拼成的数字, 用一个空格分开. 没有前导0.

    Sample Input

    4
    3
    6
    7
    15

    Sample Output

    7 7
    6 111
    8 711
    108 7111111
    # include<stdio.h>
    int matnum[8]= {0,0,1,7,4,2,6,8}; //num小于8是能拼成的最小数
    int sign[4]= {6,2,5,7}; //cnt>1时,数值的棍数只会出现这四种;
    //而这四种如果是首位,就能在head数组中找到;否则都会在base数组中找到
    int flag[8]= {0,0,1,0,0,2,0,3}; //flag的作用看DFS的注释
    int dhead[8]= {2,2,2,5,5,5,6,7}; //由余数确定头顶元素需要的火柴棍数
    int base[8]= {1,1,1,2,2,2,0,8}; //不同的火彩棍数对应的非头数值
    int head[8]= {1,1,1,2,2,2,6,8}; //不同的火彩棍数对应的头位数值
    int t,leap;
    int minnum[100],maxnum[100],loop[100];
    void DFS(int n,int len,int num)//n为剩余棍数;确定第len位的数值;num记录的是前一个棍数
    {
        //由于最小数中后一位的数不可能比前一位大,除了首位0的情况;这样就节省时间多了
        int i;
        if(leap)return;
        if(n<0||len<0)return;//剪枝
        if(n==0&&len==0)
        {
            leap=1;
            for(i=0; i<t; i++)
                minnum[i+1]=base[loop[i]];
            return;
        }
        for(i=flag[num]; i<4; i++)
        {
            loop[t++]=sign[i];//loop数组存的是每位的棍数
            DFS(n-sign[i],len-1,sign[i]);
            t--;
        }
    }
    int main()
    {
        int num,cnt,len,i,nCase;
        scanf("%d",&nCase);
        while(nCase--)
        {
            scanf("%d",&num);
            if(num<8)
            {
                cnt=1;//最小数位数
                minnum[0]=matnum[num];
            }
            else
            {
                cnt=(num-1)/7+1;//根据的是7根对应1位,8八根对应2位来写的式子
                minnum[0]=head[dhead[num-(cnt-1)*7]];
                leap=0;
                DFS(num-dhead[num-(cnt-1)*7],cnt-1,6);
            }
            if(num%2==1)//num为奇数,则最大数第一位一定是7,其余为1
            {
                len=(num-3)/2+1;
                maxnum[0]=7;
                for(i=1; i<len; i++)
                    maxnum[i]=1;
            }
            else//num为偶数,则最大数每一位数值都为1
            {
                len=num/2;
                for(i=0; i<len; i++)
                    maxnum[i]=1;
            }
            for(i=0; i<cnt; i++)
                printf("%d",minnum[i]);
            printf(" ");
            for(i=0; i<len; i++)
                printf("%d",maxnum[i]);
            printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    Python正课38 —— 有参装饰器
    Python正课37 —— 无参装饰器
    Python正课36 —— 闭包函数
    Python正课35 —— 函数对象与函数嵌套
    Python正课34 —— Global与Nonlocal
    Python正课33 —— 名称空间 与 作用域 介绍
    vue中wowjs的使用
    js得到时间戳(10位数)
    腾讯地图使用中,出现了“鉴权失败,请传入正确的key”
    js数组操作大全
  • 原文地址:https://www.cnblogs.com/locojyw/p/3705000.html
Copyright © 2011-2022 走看看