zoukankan      html  css  js  c++  java
  • 换一个角度看问题:火柴棒等式

      这个问题是说给定一定数量(最多24根)的火柴棒,用全部这些火柴棒组成一个A+B=C的算式,其中每个数字拼法如下:

    而加号和等号均为2根火柴。

    这个问题题意没有明确说明负号问题,但从出题者传递的“意境”来看,其中A,B,C均大于等于0。

    第一眼看到这个问题的时候就在想,是不是要把火柴棍数目-4然后看能分成几个数字,再把这些数字摆放成3个数字,再检测是否相等。这样做涉及的问题太多了,例如235都是5根,069都是6根……最高位不能为0……好烦的代码。换个角度思考一下,我们先有算式,然后计算火柴棍个数,这就简单多了:

    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxnum=777;
    const int nbn[10]={6,2,5,5,4,5,6,3,7,6};    //0-9
    int n2n(int n){
        if(n==0){
            return nbn[0];
        }else{
            int cnt=0;
            while(n!=0){
                cnt+=nbn[n%10];
                n/=10;
            }
            return cnt;
        }
    }
    int search(int n){
        int i,j,cnt=0;
        for(i=0;i<maxnum;i++){            //7777+0=7777
            for(j=0;j<maxnum;j++){
                if(n2n(i)+n2n(j)+n2n(i+j)==n){
                    cnt++;
                }
            }
        }
        return cnt;
    }
    int main(){
        int k;
        cin>>k;
        if(k<13){                //1+1=2
            cout<<0<<endl;
        }else{
            cout<<search(k-4)<<endl;        //+=
        }
    }

    代码中做了一点小优化。对于i,j上限的得出就是贪心的想法,7的性价比最高,假定为777+0=777(除+=正好24),类似可证77不够大,所以最大值可以用777(打印一下i、j就可以知道实际上最大用到711)。

  • 相关阅读:
    poj1661【DP,左右两端dp】
    hdoj1074【A的无比爆炸】
    hdoj1024【DP.最 大 m 字 段 和】(写完我都怕。。。不忍直视。。)
    qq教xixi写模拟加法【非常爆炸】
    错排公式
    POJ3616【基础DP】
    hdoj1257【疑问】(贪心)
    【弱的C艹之路。。未完待续】
    hdoj1728【搜索的两种写法】
    hdoj1001【智障了。。。】
  • 原文地址:https://www.cnblogs.com/zcsor/p/6357607.html
Copyright © 2011-2022 走看看