
sdnuoj 1193.火柴棒等式
注意:
发布日期:2021-05-15 01:02:46
浏览次数:22
分类:精选文章
本文共 1069 字,大约阅读时间需要 3 分钟。
题意:
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数。
火柴棍数如下
- 加号与等号各自需要两根火柴棍
- 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
- 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就差不多了,你也不能为了省事无限弄大,万一就超时了呢……
#includeusing 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<
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月06日 02时29分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
堆的应用_topK算法和堆排序
2021-05-14
最大半连通子图
2021-05-14
Remove Extra one 维护前缀最大最小值
2021-05-14
跳台阶
2021-05-14
另类加法,走方格的方案数,最近公共祖先
2021-05-14
[Java Path Finder][JPF学习笔记][7]JPF输出详细程度设置
2021-05-14
GitHub完整记录数据库GHTorrent的下载和安装经验
2021-05-14
设计模式—— 三:依赖倒置原则
2021-05-14
SpringBoot打包之后乱码
2021-05-14
因SGA分配错误无法启动数据库
2021-05-14
Oracle修改字段类型方法总结
2021-05-14
ORA-00020 超过当前最大连接数
2021-05-14
合理控制oracle数据库具有DBA权限的用户
2021-05-14
喝红茶是否会上火
2021-05-14
Android进阶解密读书笔记2——第2章:Android系统启动——第1、2小节
2021-05-14
GreenDao之注解
2021-05-14
Android使用Font Awesome
2021-05-14
主线程中Looper的轮询死循环为何没有阻塞主线程?
2021-05-14