php - 如何在金字塔排名系统中获得挑战者

标签 php algorithm

所以我得到了一个基本上是金字塔的排名系统:

     01
    02 03
   04 05 06
  07 08 09 10
 11 12 13 14 15
16 17 18 19 20 21

现在每个人都可以挑战同排左边和上排右边的每个人。

例如18可以挑战13-17
基本上你可以挑战越低的阶梯。

关于如何将其作为函数解决的任何想法?在考虑这个问题时,我只是通过倒计时计算金字塔的层数来对范围进行一些非常复杂的计算,但我确信必须有一个简单的解决方案。

范围的更多示例:
02 - 01
03 - 02
04 - 02-03
05 - 03-04
06 - 04-05
07 - 04-06
08 - 05-07
11 - 07-10
17 - 12-16

顺便说一句,尽管它看起来像是家庭作业,但我可以向你保证我已经离开学校好几年了。这实际上是一个射箭梯系统,我正试图为本地射箭俱乐部数字化 :)

最佳答案

对于玩家 x很容易看出范围内的上限值始终为 x - 1 .棘手的部分是找到较低的值。

首先请注意,您可以挑战的人数等于您上方一排的人数。通过查看下图,您可能会发现更容易理解为什么这是真的,其中每个椭圆恰好包含玩家 13 可以挑战的人之一(9、10、11、12):

showing relationship to triangular numbers

13号可以挑战的人有四个人,13号玩家上面一排有四个人。


所以我们需要求出x上面这一行的人数。请注意,x 以上的总人数是 triangular number T(n)对于一些 n .和n的值(value)是 x 上面一行的人数。

要查找三角数,您可能会发现此公式很有用:

T(n) = n * (n+1) / 2

问题是找到最大的n这样 T(n) < x .

您可以使用循环遍历 n 的所有可能值, 计算 T(n)直到超过x .这会起作用,它很简单,而且几乎可以肯定它的速度足以满足您的目的。

但您也可以使用 inverse of the above quadratic equation 更直接地到达那里:

inverse of triangulare number formula

唯一需要调整的是先减去 1来自 x因为我们希望三角数严格小于 x .如果不进行该调整,它将给出精确三角数的当前行,而不是上面的行。

使用此公式并将其转换为 PHP,我们可以直接获得任何 x 的结果:

$n = floor((sqrt(1 + 8 * ($x - 1)) - 1) / 2);
$lower = $x - $n;
$upper = $x - 1;

结果:

2: 1 - 1
3: 2 - 2
4: 2 - 3
5: 3 - 4
6: 4 - 5
7: 4 - 6
8: 5 - 7
9: 6 - 8
10: 7 - 9
11: 7 - 10
12: 8 - 11
13: 9 - 12
14: 10 - 13
15: 11 - 14
16: 11 - 15
17: 12 - 16
18: 13 - 17
19: 14 - 18
20: 15 - 19
21: 16 - 20

在线查看它:ideone

关于php - 如何在金字塔排名系统中获得挑战者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11352463/

相关文章:

php - 如何将 POST Json 和图像发送到 php alamofire

php - 如何为 Multi-Tenancy SaaS产品设计有效的数据库?

c - 在 C 中使用数组的埃拉托斯特尼筛选算法

java - 如何按升序对链表进行排序

php - MD5 密码的 SQL 更新

php - 我坚持我的 SELECT sql 查询

c# - 跟踪一组点中最大距离的最佳方法?

algorithm - 如何从一个联合的、离散的、概率分布函数中进行数值采样

python - 如何有效地在 Python 中对参数组合进行网格搜索?

php - 带列表的 Redis 通知