洛谷 P1149「NOIP 2008 提高组」火柴棒等式

原题目传送门

题解

对我来说,这道题居然有点难想(来自蒟蒻的手动狗头
其实想来想去也没那么难。
首先先定义一个数组c[]存储每一个数字(0-9)分别需要多少火柴棒来组成,然后再定义我们需要的a[]数组(用来预处理)和变量numcnt


先从数据范围说起,因为最多只有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;
    }
}

因为我们最终是连个数的和,那么就来一个双重循环ij分别从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;
}
posted @ 2021-12-26 11:07  煎饼Li  阅读(98)  评论(0编辑  收藏  举报