洛谷题单指南-暴力枚举-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 @   五月江城  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示