首页 > 技术文章 > P1149 火柴棒等式

xiaoyezi-wink 2019-06-02 21:33 原文

P1149 火柴棒等式

 

本来想着打表来,然后发现自己算不出来,AC代码造福一下人类,代码帮你表 nice

 

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

 

还好我没有打表QWQ

 

说一下正解吧

 

首先存一下摆每个0~9数字需要多少根棍(拿走不客气)

a [ i ] 表示摆出数字 i 需要多少根火柴

0 1 2 3 4 5 6 7 8 9
6 2 5 5 4 5 6 3 7 6

Ps:

   你可以要求电脑继续帮你算,因为摆一个数字,火柴棒数不可能为0,所以摆出这个数字所需火柴棒数就等于摆出它各位数字和十位数字火柴棒数之和

   即 

 

 

然后for循环枚举

(1)两层for循环枚举   i   j 不相等的情况

(2)一层for循环枚举   i   j 相等的情况

 

 f [ i ] 表示用 i 根火柴 可以摆出多少个式子

每次枚举一个式子,对应的

不要忘了运算符号

 

 

 

 提醒

for循环啊,i  j 我大概枚举到了1000  ,为了AC多枚举没关系,QWQ

 

 

 

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>

using namespace std;

int n,cnt;
int a[10000]={6,2,5,5,4,5,
              6,3,7,6,8
              },f[100000];
            
int main()
{
    scanf("%d",&n);
    
    for(int i=0;i<=1000;i++)
      for(int j=0;j<=1000;j++)
      {
          if(a[i]==0) a[i]=a[i/10]+a[i%10];
          if(a[j]==0) a[j]=a[j/10]+a[j%10];
          
        if(i!=j)
        {
            if((i+j)>10&&a[i+j]==0)
            a[i+j]=a[(i+j)/10]+a[(i+j)%10];
            
            f[a[i]+a[j]+a[i+j]+4]++;
        } 
         
      }
    for(int i=0;i<=1000;i++)
    {
        if(a[i]==0) a[i]=a[i/10]+a[i%10];
        
        if((i*2)>10&&a[i*2]==0)
          a[i*2]=a[(i*2)/10]+a[(i*2)%10];
        f[a[i]*2+a[i*2]+4]++;
    }

    for(int i=0;i<=24;i++)
    printf("%d\n",f[i]);

    return 0;    
    
}

 

推荐阅读