zoukankan      html  css  js  c++  java
  • P1149 火柴棒等式

    ---恢复内容开始---

    题目描述

    给你n根火柴棍,你可以拼出多少个形如“A+B=CA+B=CA+B=C”的等式?等式中的AAA、BBB、CCC是用火柴棍拼出的整数(若该数非零,则最高位不能是000)。用火柴棍拼数字0−90-909的拼法如图所示:

    注意:

    1. 加号与等号各自需要两根火柴棍

    2. 如果A≠BA≠BAB,则A+B=CA+B=CA+B=C与B+A=CB+A=CB+A=C视为不同的等式(A,B,C>=0A,B,C>=0A,B,C>=0)

    3. nnn根火柴棍必须全部用上

    输入输出格式

    输入格式:

    一个整数n(n<=24)n(n<=24)n(n<=24)。

    输出格式:

    一个整数,能拼成的不同等式的数目。

    输入输出样例

    输入样例#1: 复制
    14
    输出样例#1: 复制
    2
    输入样例#2: 复制
    18
    输出样例#2: 复制
    9

    说明

    【输入输出样例1解释】

    222个等式为0+1=10+1=10+1=1和1+0=11+0=11+0=1。

    【输入输出样例2解释】

    999个等式为:0+4=4 0+11=11 1+10=11 2+2=4 2+7=9 4+0=4 7+2=9 10+1=11 11+0=11


    -----------------------------------------------------------------------------------

    官方说这是一道打表题
    于是我就开始动笔算了
    算了会儿发现
    可能性太多了
    算不过来
    于是就放弃了
    然而我忘记了
    用计算机打表啊等个10分钟1个点的都没问题啊

    傻了傻了

    (加号和等于号一共是4根火柴应该是很好想的了)(也还是想到了的)

    用来打表的代码

    #include<iostream>
    using namespace std;
    const short cl[10] = { 6,2,5,5,4,5,6,3,7,6 };
    short lx(int cn)
    {
        short sm = 0;
        do
        {
            sm += cl[cn % 10];
            cn /= 10;
        } while (cn != 0);
        return sm;
    }
    int main()
    {
        bool f = false;
        for(short a=0;a<=1111;a++)
            for (short b = 0; b <= 1111; b++)
            {
                short c = a + b;
                short on = lx(a) + lx(b) + lx(c);
                if (on <= 20)
                {
                    cout << a << " " << b << " " << c << " " << on << endl;
                    f = true;
                }
            }
        if (!f)
            cout << "No.";
        return 0;
    }

    这样就会得到一堆可行的方案

    可是太多了

    怎么办啊

    自己统计会出错的啊

    还好

    还可以小小的优化一下

    一个新程序的代码:
    #include<iostream>
    using namespace std;
    const short cl[10] = { 6,2,5,5,4,5,6,3,7,6 };
    short lx(int cn)
    {
        short sm = 0;
        do
        {
            sm += cl[cn % 10];
            cn /= 10;
        } while (cn != 0);
        return sm;
    }
    int main()
    {
        short ans[12] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
        for (short a = 0; a <= 711; a++)
            for (short b = 0; b <= 711; b++)
            {
                short c = a + b;
                short on = lx(a) + lx(b) + lx(c);
                if (on <= 20)
                    ans[on - 9]++;
            }
        for (short i = 0; i <= 11; i++)
            cout << i + 13 << " " << ans[i] << endl;
        return 0;
    }

    这样就会得到下面的样子了

    13 1
    14 2
    15 8
    16 9
    17 6
    18 9
    19 29
    20 39
    21 38
    22 65
    23 88
    24 128

    这样就可以打表了

    但是不要用一堆的if

    (会慢一点的,而且代码风格也太不美观了吧qwq)

    #include<iostream>
    using namespace std;
    int main()
    {
        const short a[12] = { 1,2,8,9,6,9,29,39,38,65,88,128 };
        short n;
        cin >> n;
        if (n <= 12)
            cout << 0;
        else
            cout << a[n - 13];
        return 0;
    }
  • 相关阅读:
    关于MySQL数据库优化的部分整理
    PHP跨域form提交
    px、dp和sp,这些单位有什么区别?
    301和302 Http状态有啥区别?
    PHP HTTP请求
    php的http_build_query使用
    nginx ssi 模块
    MongoDB学习笔记(一) MongoDB介绍及安装(摘)
    Django Admin 录入中文错误解决办法
    关于python字符串连接的操作
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10351040.html
Copyright © 2011-2022 走看看