洛谷题单指南-暴力枚举-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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?