从有序列表位置的金字塔层位置

时间:2013-02-23 14:56:08

标签: algorithm

一开始它似乎是一个简单的问题,但现在我不太确定。

我有一份按其排名排序的球员名单。

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

我必须将此列表显示为金字塔,其中每个图层增加一个可以拥有的玩家数量。所以,排名第一的玩家位于金字塔顶端,第二位,第三位于第二层,依此类推...

      1 
    2 , 3
  4 , 5 , 6
7 , 8 , 9 , 10

我想知道是否有可能从排名位置(RP)获取金字塔图层编号(LN)。例如:

1 RP = 1 LN
3 RP = 2 LN
5 RP = 3 LN
8 RP = 4 LN

试图创建一个公式来获得这个值,但现在很明显我的数学需要增援。所以...我在这里。

X RP = Y LN?

3 个答案:

答案 0 :(得分:3)

让我在L级。

然后先前的(L-1)级别具有L(L-1)/ 2个数字。换句话说,由于x级中有x个数字,我们知道

x(x-1)/ 2< i≤x(x-1)/ 2 + x

或等效

x ^ 2 - x - 2i< 0

x ^ 2 + x - 2i≥0

上述两个方程的判别式是D = 1 + 8i。 显然,等级L必须低于第一个二次曲线的正根;

L< (1 +√(1 + 8I))/ 2

并且至少是第二个二次方的正根,即

L≥(-1 +√(1 + 8i))/ 2

所以,我们所要做的就是取最后一个的上限。

以C表示,该值为整数,为

(int)ceil(( - 1.0 + sqrt(1.0 + 8.0 * i))/ 2.0)

好问题!

答案 1 :(得分:2)

LN(RP=x) = ceil((sqrt(1+8x)-1)/2)

答案 2 :(得分:0)

您需要创建两个循环,外部循环用于每个级别,内部循环用于级别中的数字位数。

int pyramidCount(int val){
    if (val == 0)
        return 0;
    int count =0; 
    for (int i=1;i <=val;i++){
        for(int j=0;j <i; j++ ){
            count ++;
            if(count == val) return i;
        }
    }
    return 0;
}