1268: 火柴棒
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lldSubmitted: 43 Accepted: 21
[ Submit][ Status][ Web Board]
Description
用n根火柴,拼成一个a+b=c的等式,’+’和’=’各占两根火柴,每个数字占固定的火柴,各数字占用火柴棒数如下:
注意
1、 没有前置0,除非本身为0,a,b,c>=0.
2、 a+b=c和b+a=c记为不同的等式,除非a=b.
恰好把n根火柴用完,问一共可以凑多少种等式。
Input
多组测试样例,每组测试样例一个整数n,表示火柴棒总数。(n<=24).
Output
每组测试样例输出一个整数,表示能够凑成的等式的总个数。
Sample Input
14
18
Sample Output
2
9
HINT
样例1:0+1=1 1+0=1 两种。
本题目就是暴力,注意姿势要优美。
一开始想着用函数记忆化,但是这样子会超时,不如直接用数组存下来预处理的结果。
枚举下每个数字就可以了。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<set>
#include<map>
using
namespace
std;
#define N 10005
int
f[1007];
int
num[10]={6,2,5,5,4,5,6,3,7,6};
int
help(
int
x)
{
if
(x<10)
return
num[x];
int
sum=0;
while
(x)
{
sum+=num[x%10];
x/=10;
}
return
sum;
}
int
main()
{
// memset(f,-1,sizeof f);
int
n;
for
(
int
i=0;i<=3000;i++)
f[i]=help(i);
while
(
scanf
(
"%d"
,&n)!=EOF)
{
int
a,b,c;
int
ans=0;
n-=4;
for
(
int
i=0;i<=1000;i++)
{
for
(
int
j=0;j<=1000;j++)
{
int
k=i+j;
if
((f[i]+f[j]+f[k])==n)
{
// printf("i:%d j:%d k:%d\n",i,j,k);
//printf("hi:%d hj:%d hk:%d\n",f[i],f[j],f[k]);
//if(i==j)
ans++;
}
}
}
printf
(
"%d\n"
,ans);
}
}
/**************************************************************
Problem: 1268
User: drowner
Language: C++
Result: Accepted
Time:167 ms
Memory:1680 kb
****************************************************************/