5

だから私は基本的にピラミッドであるランキングシステムを手に入れました:

     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



ところで、宿題のように見えるかもしれませんが、私はもう数年はすでに学校を休んでいることを保証できます。これは実際に私が地元のアーチェリークラブのためにデジタル化しようとしているアーチェリーラダーシステムに入ります:)

4

1 に答える 1

9

プレーヤーにとってx、範囲の上限値が常にであることが簡単にわかりますx - 1。トリッキーな部分は、より低い値を見つけることです。

最初に、挑戦できる人数は、上の列の人数と同じであることに注意してください。次の図を見ると、なぜこれが当てはまるのかを理解しやすくなります。各楕円には、プレーヤー13が挑戦できる人物(9、10、11、12)が1人だけ含まれています。

三角数との関係を示す

13番が挑戦できるのは4人で、プレーヤー13の上の列には4人います。


したがって、xの上の行の人数を見つける必要があります。xより上の人数の合計は、一部のの三角数 であることに注意してください。そして、の値はxの上の行の人数です。T(n)nn

三角数を見つけるには、次の式が役立ちます。

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

n問題は、そのような最大のものを見つけることT(n) < xです。

ループを使用して、のすべての可能な値を実行し、を超えるまでn計算することができます。これはうまくいくでしょう、それは簡単です、そしてそれはあなたの目的のためにほぼ確実に十分に速いでしょう。T(n)x

ただし、上記の2次方程式の逆数を使用して、より直接そこに到達することもできます。

三角測量式の逆

必要な調整は、三角数を。よりも厳密に小さくしたいので、最初に減算1することだけです。その調整がないと、上の行ではなく、正確な三角数の現在の行が表示されます。xx

この式を使用して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

于 2012-07-05T21:00:33.633 に答える