嗯....
这道题好讨厌啊!!!!
一开始莫名RE,然后发现数组小了,然后发现后面几个点总是WA,原来推的少了....
并且这道题的思路真的好水啊!!
思路:
竟然自己估摸一个数(当然可以通过一定的计算算出来,但还不如自己估摸一个数),将这些数所需要的火柴数量一一求出,然后再枚举,寻找可能...
下面是AC代码(当然不是最优化代码...
1 #include<cstdio>
2 #include<iostream>
3
4 using namespace std;
5
6 int a[5006] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};//0-9所需的火柴个数
7 int cnt;
8
9 int main(){
10 int n;
11 scanf("%d", &n);
12 for(int i = 10; i <= 2000; i++){//先将2000以内的数所需的火柴数全都求出
13 int x = i;//当然可以用while循环来做
14 if(x < 100) a[x] = a[x%10] + a[x/10];
15 else if(x >= 100 && x <= 999) a[x] = a[x%10] + a[x/100] + a[x/10%10];
16 else a[x] = a[x/1000] + a[x/100%10] + a[x/10%10] + a[x%10];
17 }
18 for(int i = 0; i <= 1000; i++){
19 for(int j = 0; j <= 1000; j++){
20 if(a[i] + a[j] + a[i+j] + 4 == n) cnt++;
21 }
22 }//枚举
23 printf("%d", cnt);
24 return 0;
25 }