【问题标题】:Finding an algorithm to a simulation寻找模拟算法
【发布时间】:2013-08-13 08:08:11
【问题描述】:

我有一个金矿,每 20 小时周期以 1 个金单位的速度生产黄金(20 小时并不重要)。当它达到 250 个金单位时,它会立即购买另一个金矿(花费 250 个金),所以现在它每个周期生产两个金单位。

目前只能这样模拟

int getCycles (int targetMines) {
    int cycle = 0;
    int goldMines = 1;
    int balance = 0;

    while (goldMines != targetMines) {
        cycle++;
        balance += goldMines;
        if (balance / 250 >= 1) {
            goldMines += balance / 250;
            balance = balance % 250;
        }
    }

    return cycle;
}

我正在寻找一个更优雅的解决方案(也许更多的是数学而不是计算?)来找到达到目标金矿数量所需的周期数 (C)

【问题讨论】:

  • 它似乎是对数的。如果每n个周期=金矿的两倍,那么要到达m个金矿,您需要n = m个周期的以2为底的对数,对吗?在这种情况下,它们每 250 个周期加倍,因此类似于 250 * log2 (m) 周期。
  • @user1118321 优化并作为答案发布。
  • 问题中的代码和答案中的代码的一个小区别是收入是否离散。
  • 收入是离散的
  • 您可以将其转换为相互递归函数的系统。也许它可以简化并轻松解决。我不记得如何在没有生成函数的情况下解决相互递归函数......而且我不记得如何使用生成函数:)。也许 math.stackexchange 可以提供帮助? M(t) = # of gold mines at time t, G(t) = # of gold units at time t, M(0) = 1, M(t) = M(t-1) + floor((G(t-1) + M(t-1)) / 250), G(0) = 0, G(t) = (G(t-1) + M(t-1)) % 250

标签: algorithm math


【解决方案1】:

这将是对数。如果每 n 个周期它会使金矿翻倍,那么要达到 m 个金矿,您需要 n * log base 2 of m 个周期。在这种情况下,它们每 250 个周期加倍,因此将是 250 * log2 (m) 个周期。在 C 语言中是

numCycles = 250.0 * log2 (numMinesDesired);

【讨论】:

  • 我认为这不太对。当他的总黄金为 250 时,他购买了下一个金矿,而您的主张似乎假设它每 250 个周期翻一番(即,他只能在单个金矿达到 250 时购买另一个金矿……而且它们都达到 250同时)。例如,他在 250 个周期时购买了第二个金矿,在 375 个周期时购买了第三个,在 375 + ceil(250/4) 时购买了第四个...
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2010-11-14
  • 2016-05-29
  • 2015-04-02
相关资源
最近更新 更多