【问题标题】:Counting the minimum number of operations needed to reach a certain number计算达到一定数量所需的最少操作次数
【发布时间】:2014-04-09 18:16:48
【问题描述】:

我应该如何为这个挑战实现算法?

有三个整数,A、B 和 C。

您的计算器从数字 1 开始,它必须达到 C。为此,您可以执行两个操作:

  • 将您的数字乘以 A(如果结果超过 4 位,则结果为 1)。
  • 将您的数字除以 B(整数除法)。

您必须返回达到 C 所需的最少操作数。

此外,您的计算器只有四位数字,因此您可以期望 A、B 和 C 输入最多为 9999。

例子:

A = 2, B = 3, C = 10

1*A = 2 
2*A = 4 
4*A = 8 
8*A = 16 
16/B = 5 
5*A = 10

所以结果将是6 步数。


我曾经通过暴力破解结果来做到这一点(尝试了很多组合并抓住了步数最少的一个)。太傻了。

【问题讨论】:

  • 当您说计算器限制为四位数时,是否包括中间值?如果我有 600,然后进行乘法然后除法,我得到 400 还是 66?任何数字都可以是负数吗?
  • 你能乘以超过 9999 吗?在这种情况下会发生什么?
  • 我认为对于任何大于 9999/A 的数字,相乘只会将值重置为 1。
  • 溢出饱和到1?这是我听过的最奇怪的溢出行为......

标签: algorithm


【解决方案1】:

这可以简化为图 G=(V,E) 上的 shortest path problem,其中顶点 V={0,1,2,...,9999} 和 E = { (x,y) | y = x*a, y< 10,000 or y = x /b } U { (x,1) | x*a > 10,000 }

现在,您需要找到从1 到目标的最短路径。可以通过运行BFS、A* Search algorithm(如果您找到好的启发式算法)或bi-directional search(基本上是同时来自目标和来自源的 BFS)来完成

编辑:
(注意:原始答案包含一些不同的边缘集,这适合稍微不同的问题。无论哪种方式 - 主要思想仍然存在)

【讨论】:

  • 双向搜索很棘手,因为由于整数除法,向后搜索很棘手。在他的示例中,从 10 开始,如果最后一步是除法,则来自 30、31 或 32 的那个。需要注意多种可能性。
  • 我确实喜欢跟踪每个顶点的路径的想法,这使您可以快速解决明显的故障情况,并且(在双向搜索中),找到的第一个完整路径是最短的小路。非常有效。
  • 另请注意,顶点 0 实际上不需要跟踪,因为它从未在完整路径中使用。 (另外,第一步总是乘法)
  • @MooingDuck 为什么这么棘手?对于某些节点,您只会获得不同数量的入边,而对于其他节点则更少 - 但它仍然可以生成。给定一个数字x 和一个常数b,很容易找到满足{ y | x/b = y} 的集合,对于这个集合中的每个y,您将有(x,y) 作为边。 (其中有b,很容易找到)
  • @MooingDuck 关于 0 和第一步 - 我认为微优化。我更喜欢抽象和简化,使用纯图更简单,任何最短路径算法无论如何都不会开发出这个节点(0)。
猜你喜欢
  • 2020-02-12
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2016-05-15
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多