P1149 火柴棒等式

Posted mary-sue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1149 火柴棒等式相关的知识,希望对你有一定的参考价值。

题目描述

给你n根火柴棍,你可以拼出多少个形如“ A+B=C”的等式?等式中的 A 、 B 、 C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 00 )。

用火柴棍拼数字 0-9 的拼法如图所示:

技术分享图片

注意:

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

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

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

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

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

说明

【输入输出样例1解释】

2 个等式为 0+1=1 和 1+0=1 。

【输入输出样例2解释】

9 个等式为:

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

 

这个题感觉非常复杂,,,
刚开始也想到搜索了,
但想着想着就混乱了,,,数字,需要的火柴数,,,全混乱了。

最后还是去看了题解,
第一篇太牛逼了,
这种思路也可以想的出来,,,
反正看着不是特别复杂,,但还是理解了好长时间才明白。、

首先要知道,我们要求的一系列等式,不只是在十进制范围内,
还可能有两位数,三位数,(好复杂。。。),
而且还可以重复用。一个数可以用好多遍没有限制,只要满足等式。
但我们只知道0-9的火柴棒数,
根据题解,我们可以先求出往后更多数对应的火柴棒数,
以方便后面的操作,
但至于为什么是2000,后面是1000,我就不清楚了,
我只知道前面这个2000必须是后面那个1000的两倍,
因为有个操作是a[i]+a[j]+a[i+j],i,j到1000,所以必须要知道2000的,
但这个1000到底是怎么算出来的呢?
不知道,,,反正小了的话,24最后那个大样例好像过不了。。

计算出每个数对应的火柴棒数,那就可以暴力枚举了!
从0开始,下标即是对应的数字,所以要计算a[i]+a[j]+a[i+j]的,
因为i+j==i+j啊。
数组a即是数字对应的火柴棒数,
如果a[i]+a[j]+a[i+j]对应的火柴棒数再加上“+”和“=”对应的火柴棒数正好等于n
那么就算做一种方案。

完毕,,感觉太神奇了。
ac代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int a[2002],b[2002]={6,2,5,5,4,5,6,3,7,6};
 9 int n,ans;
10 
11 int main()
12 {
13     scanf("%d",&n);
14     for(int i=1;i<=2000;++i)
15     {
16         int j=i;
17         while(j)
18         {
19             a[i]+=b[j%10];
20             j/=10;
21         }
22     }
23     a[0]=6;
24     for(int i=0;i<=1000;++i)    
25         for(int j=0;j<=1000;++j)    
26             if(a[i]+a[j]+a[i+j]==n-4)
27                 ans++;
28     printf("%d",ans);
29     return 0;
30 }

如果你不开心,那我就把右边技术分享图片这个帅傻子分享给你吧,
你看,他这么好看,跟个zz一样看着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。
时间时间会给你答案2333

以上是关于P1149 火柴棒等式的主要内容,如果未能解决你的问题,请参考以下文章

P1149 火柴棒等式

P1149 火柴棒等式

P1149 火柴棒等式

P1149 火柴棒等式

P1149 火柴棒等式(打表)

luogu P1149 火柴棒等式