1288 埃及分数
题解:
- 正解:(紫书P206)
- IDA*,迭代加深搜索!一层一层地搜;用dfs的空间开销解决bfs的问题,并且方便了剪枝;有现成的系统栈能调用,还不用打堆;代码量小,易写易调试。
- 以把原分数分解成的分数个数K为层数,从一开始的状态按照分母从小到大的顺序搜索。若在某一层搜到了解并且这一层已经搜完了,那这一层的最优解一定是整个问题的最优解。
- 假设现在要分解的分数是a/b;
- 若当前原分数已经分解成为超过K个分数,直接返回即可。
- 若a能整除b,那分解结束了,最后一个分母是b/a。用当前的解去更新答案,如果没有答案或当前解包含的分母个数少于答案或当前解包含的分母个数等于答案且当前解的最大分母比答案大,则当前解即为答案。
- 否则,要枚举i,使得ab=a′b′+1i,使i作为当前解的一部分,进入下一层递归。
- i的范围如何确定?
- 首先i要大于等于[ba],只有这样,才能使ab≥1i,这样的i才满足题意;其次i要大于当前解中分母最大的元素,这是搜索顺序决定的。同时i的值不能太大,要满足当前的分数有能分解成K个以内分数的可能性,假设i作为第step个分母,那么第step+1到第K个分母都应大于i,这些分数的和小于K−stepi,要有解,则必须1i+K−stepi=K−step+1i≥ab,即i≤[b(K−step+1)a],如果算出来的i大于int的最大值,那就以int的最大值为界,否则算一段时间就会爆掉的,体现为变成负数然后TLE。注意a′b′进入下层时要约分,否则爆掉的几率会大大增加。
- 然后,就可以AC了
AC代码:
__EOF__

本文作者:shenben
本文链接:https://www.cnblogs.com/shenben/p/5994758.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/shenben/p/5994758.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术