4

Androidでアプリを開発しているときに問題が発生します。ただし、問題は次のとおりです。

xボックスとyボールがありますがx <= y、ボールを分配してボックス内に順番に配置したいと思います。例:3つのボックス。box Abox Bおよびbox C-および5つのボール。ball 1、、、、、。ball 2_ ball 3_ ball 4_ball 5

私が必要としているのは、最初のボールを中に入れることです。内側ball 1box A他のボールはそれらすべての間に分散されます(1つのボックスに他のボックスより多くのボールがあるかどうかは関係ありません)。問題をシミュレートするループ(増分値がない)を次に示します。ball 5box C

int boxCount = 0; // first box is 0 and last box is x
int numOfBalls = y;
for(int i = 0; i < numOfBalls; i++, boxCount += ???)
{
    boxes.get(boxCount).add(balls.get(i));
}

???問題を解決する代わりに、どの方程式を使用する必要がありますか?


編集:

以来x <= y、それは意味します:

  • どのボックスも空にしないでください。
  • ボックスのボール数の差は1を超えてはなりません。

EDIT2

によってin order、私はこれを意味しました:

A   B   C
---------
1   3   5
2   4

いいえ

A   B   C
---------
1   2   3
4   5
4

4 に答える 4

3

(int)n/k最初のボックスのそれぞれにボールを分配k-1し、最後のボックスに残りを分配することができます。これはコーディングが最も簡単です。

これとともに:boxCount += (i % (numOfBalls/numOfBoxes) == 0 && boxCount < numOfBoxes-1 ? 1 : 0)

于 2012-04-09T20:12:08.487 に答える
3
int flag;
int lastBallAdded = 0;
int k = numOfBalls/numOfBoxes;
int m = numOfBalls%numOfBoxes;

for(int i = 0; i < numOfBoxes; i++, lastBallAdded+=k+flag) {
    flag = i<m;

    for(int j=lastBallAdded;j<lastBallAdded + k + flag;j++) 
        boxes.get(i).add(balls.get(j));
}

これが、このソリューションの背後にある理由です。

問題の定義により、アルゴリズムは、ボールを配置する必要がある最初のボックスk= numOfBalls/numOfBoxesを除いて、各ボックスにボールを配置m = numOfBalls%numOfBoxesする必要がありますk+1

または、次のように書くこともできます

int i;
for(i = 0; i < m; i++) {
    //add k+1 balls
}

for(;i<numOfBoxes; i++) {
    //add k balls
}
于 2012-04-09T20:27:06.340 に答える
2
int ball = 0;
for( int box = 0; box < x; ++box )
   while ( x * (ball+1) <= y * (box+1) )
      boxes.get(box).add(balls.get(ball++));

ループ不変条件: 左のkボックスにk/xは、ボールの一部 (丸みを帯びたもの) が含まれています。

于 2012-04-09T20:49:18.233 に答える
1

OK、新しい試み:

boxCount = ((i * nbrOfBoxes) / nbrOfBalls) + 1;

ボールのインデックスには0から4までの番号が付けられていることに注意してください(forループの場合と同様)。+ 1boxCountをゼロベースにしたい場合は削除します。

于 2012-04-09T20:29:16.107 に答える