鱼C论坛

 找回密码
 立即注册
查看: 99|回复: 5

火柴棒等式

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我只能想出以下代码,问号部分思路断了
  1. #include <iostream>

  2. using namespace std;

  3. int main()
  4. {
  5.     int hcb={6,2,5,5,4,5,6,3,7,6};
  6.     int n;
  7.     cin>>n;
  8.     n-=4;
  9.     int t=n;
  10.     while(n){
  11.         ???
  12.         for(int i=0;???;++i){
  13.             n-=hcb[i];
  14.         }
  15.         ???
  16.     }
  17.     return 0;
  18. }
复制代码


题:

Snipaste_2025-04-19_13-14-47.png

链接:https://code.xueersi.com/codeup/topic/list?tidan_id=27&problem_code=T0301710&package_name=CSP-J%E7%AE%97%E6%B3%95%E8%BF%9B%E9%98%B6
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
题目文字黏过来~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层

题目描述
给你n根火柴棍,你可以拼出多少个形如A+B=C的等式?等式中的ABC是用火柴棍评出来的整数(若该数非零,则最高位不能为0)。用火柴棍拼数字0~9的拼法如图所示:

注意:

1、加号与等号各自取两根火柴棍

2、如果A≠B,则A+B=C与B+A=C视为不同的等式(A,B,C≥0)

3、n根火柴棍必须全部用上

Clipboard Image.png
输入描述
一个整数n(1≤n≤24)
输出描述
一个整数,能拼成的不同等式的数目
样例1
输入
14
输出
2
样例2
输入
18
输出
9
提示
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 20:27 | 显示全部楼层
player-none 发表于 2025-4-19 17:48
题目描述
给你n根火柴棍,你可以拼出多少个形如A+B=C的等式?等式中的ABC是用火柴棍评出来的整数(若该 ...

@Fishc
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 20:35 | 显示全部楼层
琅琊王朝 发表于 2025-04-22 20:27
player-none 发表于 2025-4-19 17:48
题目描述
给你 ...


根据题意,我们需要找出所有满足A+B=C的火柴棍等式。以下是详细步骤和代码实现:

思路分析
1. 火柴棍数量预处理:每个数字0-9对应的火柴棍数已知。
2. 生成合法数字:用BFS生成所有可能的合法数字(无前导零),并记录每个数字的火柴棍数量。
3. 枚举所有组合:遍历所有A和B的组合,计算C=A+B,检查是否满足等式条件。


  1. # 每个数字0-9需要的火柴棍数量
  2. match_counts = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6]

  3. def generate_valid_numbers(max_total):
  4.     from collections import deque
  5.     valid = {}
  6.     # 添加0
  7.     if match_counts[0] <= max_total:
  8.         valid[0] = match_counts[0]
  9.     queue = deque()
  10.     # 初始化1-9
  11.     for digit in range(1, 10):
  12.         cnt = match_counts[digit]
  13.         if cnt <= max_total:
  14.             valid[digit] = cnt
  15.             queue.append((digit, cnt))
  16.     # BFS生成所有合法数字
  17.     while queue:
  18.         num, curr_cnt = queue.popleft()
  19.         for d in range(10):
  20.             new_num = num * 10 + d
  21.             add_cnt = match_counts[d]
  22.             new_total = curr_cnt + add_cnt
  23.             if new_total > max_total:
  24.                 continue
  25.             if new_num not in valid:
  26.                 valid[new_num] = new_total
  27.                 queue.append((new_num, new_total))
  28.     return valid

  29. n = int(input())
  30. if n < 4 + 2*3:  # 最小情况:A=1, B=1, C=2,总火柴2+2+5+4=13
  31.     print(0)
  32. else:
  33.     max_total = n - 4  # 总火柴数(A+B+C)
  34.     valid = generate_valid_numbers(max_total)
  35.     count = 0
  36.     numbers = list(valid.keys())
  37.     for a in numbers:
  38.         a_cnt = valid[a]
  39.         for b in numbers:
  40.             b_cnt = valid[b]
  41.             c = a + b
  42.             if c not in valid:
  43.                 continue
  44.             total = a_cnt + b_cnt + valid[c]
  45.             if total + 4 <= n:
  46.                 count += 1
  47.     print(count)
复制代码


代码说明
1. generate_valid_numbers函数:用BFS生成所有可能的合法数字,避免前导零。
2. 主逻辑:输入n后,先处理边界情况,再生成合法数字列表,最后枚举所有组合统计符合条件的等式数量。

提示:代码时间复杂度为O(M^2),M为合法数字数量,适用于n较小的情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 20:45 | 显示全部楼层
琅琊王朝 发表于 2025-04-22 20:27
player-none 发表于 2025-4-19 17:48
题目描述
给你 ...


  1. def count_matches(x):
  2.     # 每个数字对应的火柴棍数量
  3.     digit_matches = [6,2,5,5,4,5,6,3,7,6]
  4.     if x == 0:
  5.         return digit_matches[0]
  6.     s = str(x)
  7.     # 检查前导零
  8.     if len(s) > 1 and s[0] == '0':
  9.         return -1
  10.     total = 0
  11.     for c in s:
  12.         total += digit_matches[int(c)]
  13.     return total

  14. def count_equations(n):
  15.     m = n - 4  # A+B+C的火柴总数
  16.     if m < 0:
  17.         return 0
  18.    
  19.     # 预生成有效数字及其火柴数
  20.     max_num = 20000  # 经验值,覆盖大部分情况
  21.     valid_numbers = []
  22.     count_map = {}
  23.     for x in range(0, max_num + 1):
  24.         cnt = count_matches(x)
  25.         if cnt != -1:
  26.             valid_numbers.append(x)
  27.             count_map[x] = cnt
  28.    
  29.     res = 0
  30.     for A in valid_numbers:
  31.         cnt_a = count_map[A]
  32.         if cnt_a > m:
  33.             continue
  34.         for B in valid_numbers:
  35.             cnt_b = count_map[B]
  36.             if cnt_a + cnt_b > m:
  37.                 continue
  38.             C = A + B
  39.             if C not in count_map:
  40.                 continue
  41.             cnt_c = count_map[C]
  42.             if cnt_a + cnt_b + cnt_c == m:
  43.                 res += 1
  44.     return res

  45. # 示例输入输出测试
  46. n = int(input())
  47. print(count_equations(n))
复制代码


思路解析

1. 火柴数映射:每个数字0-9对应的火柴棍数量预先定义,例如1用2根,7用3根。
2. 前导零处理:若数字非零且以0开头(如01),则视为无效。
3. 预处理有效数字:生成所有可能的有效数字(0到20000),并记录它们的火柴棍数量。
4. 双层循环遍历:遍历所有可能的A和B组合,计算C=A+B,检查:
   - A、B、C是否均为有效数字
   - 火柴棍总数是否等于n-4
5. 时间复杂度优化:通过预计算和范围剪枝(如提前跳过超过火柴总数的组合)提升效率。

关键点
- 加号和等号固定消耗4根火柴,因此A+B+C的总火柴数为n-4。
- 数字非零时不能有前导零,例如01非法,但0合法。
- 暴力枚举时需合理设定数字上限(如20000),避免超时。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 03:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表