火柴棍

火柴棍








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

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

# 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("\n");

    }

    return
0;

}

  

时间: 2024-10-20 13:39:20

火柴棍的相关文章

CDOJ 1260 火柴棍数字(二)

Fish是一条生活在海里的鱼,有一天他很无聊,于是他去捡了人类扔进海里的垃圾,打算用这些来玩些什么. 他从捡回来的垃圾堆里找到了n根火柴棍,他想把这些火柴棍拼成一个长度为m的十进制数,每个数字的拼法如下图所示. 他想拼出来的数尽量大,这该怎么拼呢? 聪明的你,肯定知道该如何利用这n根木棒得到最大的m位数. 那就快告诉Fish吧~ 当然,不能有前导0哦. 而且木棍得全部用完! Input 第一行输入两个整数,n,m 满足 1<=n,m<=105 Output 将这m位数输出 如果不能得到任何一个

[Swust OJ 179]--火柴棍(找规律)

题目链接:http://acm.swust.edu.cn/problem/0179/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 火柴棍可以拼成10进制的数字,如图所示: 现在,gogo给你个n个火柴棍,要求你输出最小能拼成的数字和最大能拼成的数字. Input 第一行输入一个整数T:T组测试数据(T<100) 每行输入一个n (2 ≤ n ≤ 100): 表示你有的火柴棍数. Output 最小能拼成的数字和最大能拼成的数字

火柴棍移动的一道面试题

最近有朋友找工作,面试某公司,遇到一个火柴棍移动的面试题,感觉有点意思,在此抛砖引玉. 题目大致是这样的: 一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式. 注:"+"可以移走一根火柴变成"-" 例如: 废话不说,直接上代码,哪位网友有更好的方法,请分享一下,多谢 #include <stdio.h> /* 定义操作符号,"+"或"-" */ #define SYMBO

火柴棍等式问题

首先确定每个数字所用的火柴棍树木,用一层递归一层循环枚举一次,确定两个加数的值,算出和,进行进行判断,若符合条件则进行记录. 1 #include<cstdio> 2 int need[]={6,2,5,5,4,5,6,3,7,6}; 3 int ans=0;int h=0; 4 int n; 5 int ab[1000]; 6 int cnt(int cur){ 7 int ans=0,ret; 8 if(cur==0) return 6; 9 while(cur>0){ 10 ret

火柴棍等式

问题描述: 现在小明有n根火柴棍,希望拼出如 A+B=C 的等式.等式中的A.B.C均是用火柴棍拼出来的整数(若该数非零,则最高位不能是0).数字0~9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍. 如果 A≠B ,则 A+B=C 与 B+A=C 视为不同的等式(A.B.C都大于0). 所有的火柴棍必须全部用上. 假如现在小明手上有m根(m ≤ 24)火柴棍,那么小明究竟可以拼出多少个不同的形如 A+B=C 的等式呢? 分析: 1,既然要找出形如A+B=C这样的等式,那最简单的办法就是

[SCOI2013]火柴棍数字(背包)

题目 做饭 由于越高位越好,我们先得出能组成的最高位 \(f[i][j][k]\)表示从低到高位第\(i\)位,手里拿着\(j\)根火柴,第\(i\)位是否为\(0\)所需要的最少火柴 我们转移仅需得出移动,与多余或需添的映射关系:然后枚举变化关系去转移 得出最高位后,直接贪心看目前所在最高位是否能添某个数字(最大) #include<cstdio> #include<cstring> #include<algorithm> using namespace std; c

[LeetCode] Matchsticks to Square 火柴棍组成正方形

Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match girl has, please find out a way you can make one square by using up all those matchsticks. You should not break any stick, but you can link them up, a

取火柴-博弈论

取火柴 (10分)C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容: 有n个火柴棍,两个游戏玩家a和b轮流取,规则是第一次取的人最少取1根,最多取n-1根,随后每人最多只能取对方上一次取的数目 的2倍,最少取1根.谁取到最后一根为胜者.试问先取的人是赢还是输. 输入描述n输出描述1表示胜,0表示输输入样例3输出样例0 解析:说白了,就是每个人只能取1或者2.(双方都不想因为自己而让对方的选择余地变大) #include<iostream> using namespace st

TYVJ P1012 火柴棒等式 Label:枚举

背景 NOIP2008年提高组第二题 描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示:注意:1. 加号与等号各自需要两根火柴棍2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0)3. n根火柴棍必须全部用上 输入格式 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式 输出文件matches.out共一行,表示能拼成的不同等