P1149 火柴棒等式 https://www.luogu.org/problemnew/show/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;
- }
来源: http://www.bubuko.com/infodetail-3080827.html