HDU2772 Matchsticks

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2772

题目大意: 用火柴拼出0到9的数字:

                   

                   数字: 1    2    3    4    5    6    7    8    9    0

                  火柴数: 2    5    5    4    5    6    3    7    6    6

                 给出n条火柴,问能够拼出的数字中最小和最大分别是多少? 

解题思路: 简单的模拟题(由于数字太大,打表不了):

                  1.拼出的数字最小,就要使用 需要火柴数较多 的数字,使得这串数字总位数最小;

                  2.拼出的数字最大,则使用 需要火柴数较少 的数字,使得这串数字总位数最大:

                     看数字7和数字1,他们所需的火柴数最小,并且2和3相差1,可以凑成任意的n (n>=2) ;

                   把n=22之前的都打印出来就可以很容易的找到规律了:

                   n=2 1 1
                   n=3 7 7
                   n=4 4 11
                   n=5 2 71
                   n=6 6 111
                   n=7 8 711
                   n=8 10 1111
                   n=9 18 7111
                   n=10 22 11111
                   n=11 20 71111
                   n=12 28 111111
                   n=13 68 711111
                   n=14 88 1111111
                   n=15 108 7111111
                   n=16 188 11111111
                   n=17 200 71111111
                   n=18 208 111111111
                   n=19 288 711111111
                   n=20 688 1111111111
                   n=21 888 7111111111
                   n=22 1088 11111111111
                   n=23 1888 71111111111
                   n=24 2008 111111111111
                   n=25 2088 711111111111
                   n=26 2888 1111111111111
                   n=27 6888 7111111111111
                   n=28 8888 11111111111111
                   n=29 10888 71111111111111
                   n=30 18888 111111111111111

         最小的数:

                从15开始周期T=7,每个元素分别是108  188  200  208  288  688  888,每加一个周期多一个8;

         最大的数:

                从2开始 周期T=2,每个元素分别是1 7,每加一个周期多一个1;


#include <stdio.h>
#include <string.h>

int main()
{
    freopen("in.txt","r",stdin);
    int t,n,bs1,ys1,bs2,ys2;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        if(n <= 1)
            return 0;
        if(n == 2)
            printf("1 1\n");
        else if(n == 3)
            printf("7 7\n");
        else if(n == 4)
            printf("4 11\n");
        else if(n==5)
            printf("2 71\n");
        else if(n == 6)
            printf("6 111\n");
        else if(n == 7)
            printf("8 711\n");
        else if(n == 8)
            printf("10 1111\n");
        else if(n == 9)
            printf("18 7111\n");
        else if(n == 10)
            printf("22 11111\n");
        else if(n == 11)
            printf("20 71111\n");
        else if(n == 12)
            printf("28 111111\n");
        else if(n == 13)
            printf("68 711111\n");
        else if(n == 14)
            printf("88 1111111\n");
        else
        {
            bs1 = ( n - 15 ) / 7;
            ys1 = (n - 14) % 7;
            if(ys1 == 1)
                printf("108");
            else if(ys1 == 2)
                printf("188");
            else if(ys1 == 3)
                printf("200");
            else if(ys1 == 4)
                printf("208");
            else if(ys1 == 5)
                printf("288");
            else if(ys1 == 6)
                printf("688");
            else if(ys1 == 0)
                printf("888");
            if(bs1!=0)
                while(bs1--)
                    printf("8");
            bs2 = (n - 2) / 2;
            ys2 = n % 2;
            printf(" ");
            if(ys2 == 0)
                printf("1");
            else
                printf("7");
            while(bs2 --)
                printf("1");
            printf("\n");
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值