sdnuoj 1193.火柴棒等式
发布日期:2021-05-15 01:02:46 浏览次数:22 分类:精选文章

本文共 1069 字,大约阅读时间需要 3 分钟。

题意:

给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数。

火柴棍数如下
在这里插入图片描述
注意:

  1. 加号与等号各自需要两根火柴棍
  2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
  3. n根火柴棍必须全部用上

这个题就是暴力枚举

先把每个数字的火柴棍数写出来

int tr[10] = {   6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

要想满足题意就得满足两个条件

1.A + B = C这个数学等式得成立
2.就是得满足A的火柴棍数 + B的火柴棍数 + C的火柴棍数 = n - 4 (4 是指加好和等号的火柴棍数)

然后就直接写暴力判断,本来我写的是三个循环,就是每个循环一个数ABC,结果时间太长了,等半天也不出结果

后来发现写两个就可以 因为 i + j 就等于第三个数C,所以就把两个判断缩减成一个了,就f(i + j) == n - 4 - f(i) - f(j)(巧妙吧……)

还有一点就是枚举的次数 有点东西,就是你写出来那个火柴棍的个数会发现,7是三个,就有可搞性,比如771 + 1 = 772,共23个,没超,所以这个范围得到800就差不多了,你也不能为了省事无限弄大,万一就超时了呢……

#include
using namespace std;int tr[11] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6};int f(int x){ int sum = 0; if(x < 10) return tr[x % 10]; else { while(x) { sum += tr[x % 10]; x = x / 10; } return sum; }}int main(){ int n; int ans = 0; cin>>n; n = n - 4; for(int i = 0; i <= 800; i++) { for(int j = 0; j <= 800; j++) { if(f(i + j) == n - f(i) - f(j)) ans++; } } cout<
上一篇:sdnuoj1086
下一篇:2020.11.27哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年04月06日 02时29分29秒