洛谷 P1149「NOIP 2008 提高组」火柴棒等式
原题目传送门
题解
对我来说,这道题居然有点难想(来自蒟蒻的手动狗头
其实想来想去也没那么难。
首先先定义一个数组c[]
存储每一个数字(0-9)分别需要多少火柴棒来组成,然后再定义我们需要的a[]
数组(用来预处理)和变量num
,cnt
。
先从数据范围说起,因为最多只有2000,那么我们就把1到2000分别用火柴棒表示一下看需要多少个火柴棒。
for (int i=1;i<=2000;i++){
int tmp=i;
while(tmp>=1){
a[i]=a[i]+c[tmp%10];
tmp=tmp/10;
}
}
因为我们最终是连个数的和,那么就来一个双重循环i
和j
分别从0到1000进行枚举。
这里的a[i]
是第一个数,a[j]
是第二个数,a[i+j]
是a[j]
和a[i]
之和,最后还有一个4是因为+
号和=
号各自需要2根火柴棒组成。
for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++)
if (a[i]+a[j]+a[i+j]+4==num) cnt++;
}
最后,就直接看成品吧!
直接上代码(请抄袭(手动狗头
#include <bits/stdc++.h>
#define size 5005
using namespace std;
int a[size]={6},c[10]={6,2,5,5,4,5,6,3,7,6};
int num,cnt=0;
int main(){
scanf("%d",&num);
for (int i=1;i<=2000;i++){
int tmp=i;
while(tmp>=1){
a[i]=a[i]+c[tmp%10];
tmp=tmp/10;
}
}
for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++)
if (a[i]+a[j]+a[i+j]+4==num) cnt++;
}
printf("%d\n",cnt);
system("pause");
return 0;
}