P1149 火柴棒等式
Posted mary-sue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1149 火柴棒等式相关的知识,希望对你有一定的参考价值。
题目描述
给你n根火柴棍,你可以拼出多少个形如“ A+B=C”的等式?等式中的 A 、 B 、 C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 00 )。
用火柴棍拼数字 0-9 的拼法如图所示:
注意:
-
加号与等号各自需要两根火柴棍
-
如果 A≠B ,则 A+B=C 与 B+A=C 视为不同的等式( A,B,C>=0 )
-
n 根火柴棍必须全部用上
输入输出格式
输入格式:
一个整数 n(n<=24) 。
输出格式:
一个整数,能拼成的不同等式的数目。
输入输出样例
说明
【输入输出样例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 火柴棒等式的主要内容,如果未能解决你的问题,请参考以下文章