洛谷 P1149 火柴棒等式

嗯....

 

这道题好讨厌啊!!!!

 

一开始莫名RE,然后发现数组小了,然后发现后面几个点总是WA,原来推的少了....

 

并且这道题的思路真的好水啊!!

 

先看一下题:

题目描述

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

注意:

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

  2. 如果A≠B,则A+B=CB+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

前面说过,这道题的思路太水了..

思路:

竟然自己估摸一个数(当然可以通过一定的计算算出来,但还不如自己估摸一个数),将这些数所需要的火柴数量一一求出,然后再枚举,寻找可能...

 

下面是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 }
 

猜你喜欢

转载自www.cnblogs.com/New-ljx/p/10665545.html
今日推荐