洛谷题单指南-暴力枚举-P1149 [NOIP2008 提高组] 火柴棒等式

原题链接:https://www.luogu.com.cn/problem/P1149

题意解读:计算符合A+B=C时,火柴棍数量正好等于n,可以采用枚举A、B,然后计算出C,根据A、B、C计算出所有火柴棍数量,再加上4根加号、等号的,如果与n相等,即为一种合法等式。

解题思路:

题目的关键在于枚举A、B时,最大值的设定,不能超时。

分析思路如下:

由于n最大是24,除开加号、等号,可用于拼数字的火柴棍有20根,且要分配到A、B、C三个数;

一个基本常识:用的火柴棍越少,可拼的数字就越长,也就越大;

再看每个数字所用的火柴棍数,1只需要2根,是最少的,假设B数用最少的火柴棍即2根,那么A、C分剩余18根;

根据A+B=C,那么C的数字长度要么等于A的数字长度,要么比A的数字长度多1;

18根火柴棍可以组成9个1,因此A最大为1111,不能再大了。

同样的分析,B最大也为1111,O(n2)不会超时。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int h[10] = {6, 2, 5, 5, 4 ,5, 6, 3, 7, 6}; //每个数字对应的火柴棍数
int n, ans;

//数字x由多少根火柴棍组成
int count(int x)
{
    if(x == 0) return h[0];

    int cnt = 0;
    while(x)
    {
        cnt += h[x % 10];
        x /= 10;
    }
    return cnt;
}

int main()
{
    cin >> n;

    for(int a = 0; a <= 1111; a++)
    {
        for(int b = 0; b <= 1111; b++)
        {
            int c = a + b;
            int all = count(a) + count(b) + count(c) + 4;
            if(all == n) ans++;
        }
    }

    cout << ans;
}

 

posted @ 2024-02-01 18:02  五月江城  阅读(112)  评论(0编辑  收藏  举报