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;
    }
    

      

  • 相关阅读:
    javap,是 java printer 的缩写,是 JDK 自带的 Java 字节码分析工具
    这段代码的返回值在出现异常和不出现异常的情况下,分别应该是多少?
    strictfp 关键字修饰方法,即 strict float point (精确浮点)
    transient 修饰符修饰属性:不需要序列化的属性
    Java 中的 CAS 操作
    ReentrantLock 与 synchronized 的比较
    线程安全的实现方法:互斥同步、非阻塞同步、无同步方案
    J.U.C包的意义
    synchronized 原理
    什么场景下,使用 final、volatile、Atomic原子类、synchronized、J.U.C 包中的锁?
  • 原文地址:https://www.cnblogs.com/locojyw/p/3705000.html
Copyright © 2011-2022 走看看