【发布时间】: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