- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我得到了一个基本上是金字塔的排名系统:
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):
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 更直接地到达那里:
唯一需要调整的是先减去 1
来自 x
因为我们希望三角数严格小于 x
.如果不进行该调整,它将给出精确三角数的当前行,而不是上面的行。
使用此公式并将其转换为 PHP,我们可以直接获得任何 x
的结果:
$n = floor((sqrt(1 + 8 * ($x - 1)) - 1) / 2);
$lower = $x - $n;
$upper = $x - 1;
结果:
2: 1 - 13: 2 - 24: 2 - 35: 3 - 46: 4 - 57: 4 - 68: 5 - 79: 6 - 810: 7 - 911: 7 - 1012: 8 - 1113: 9 - 1214: 10 - 1315: 11 - 1416: 11 - 1517: 12 - 1618: 13 - 1719: 14 - 1820: 15 - 1921: 16 - 20
在线查看它:ideone
关于php - 如何在金字塔排名系统中获得挑战者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11352463/
我是一名优秀的程序员,十分优秀!