2

最初は簡単な問題のように見えましたが、今ではよくわかりません。

ランキング順に並べられたプレイヤーのリストがあります。

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

このリストをピラミッドとして表示する必要があります。各層は、それが持つことができるプレーヤーの数を 1 ずつ増やします。つまり、ランキングの最初のプレーヤーがピラミッドの頂点に、2 番目と 3 番目のプレーヤーが 2 番目の層に、というように...

      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?

4

3 に答える 3

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

上記の 2 つの式の判別式は、D = 1 + 8i です。明らかに、レベル L は最初の 2 次式の正の根より下でなければなりません。あれは

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

少なくとも 2 番目の二次方程式の正の根になります。つまり、

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

だから、私たちがしなければならないのは、最後の天井を取ることだけです。

C の用語では、この値は整数として次のようになります。

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

ナイスな問題!

于 2013-02-23T16:56:46.433 に答える
2

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

于 2013-02-23T15:42:59.403 に答える
0

2 つのループを作成する必要があります。外側のループは各レベル用で、内側のループはレベルの桁数用です。

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;
}
于 2013-02-23T16:04:45.790 に答える