2012-04-09 93 views
4

我在Android上開發應用程序時遇到了問題。然而,問題是:算法:將y球放入x盒子中,其中x <= y

x盒和y球,其中x <= y,我要分發的球,把它們放在箱子裏面爲了。例如:3盒; box Abox Bbox C - 和5個球; ball 1ball 2,ball 3,ball 4,ball 5

我需要的是把第一球ball 1box Aball 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 
+0

只是爲了澄清,你想要在球盒上均勻分佈球嗎? – 2012-04-09 20:08:58

+2

boxCount = i%nbrOfBoxes; – matsev 2012-04-09 20:09:07

+0

@YetAnotherGeek如果一個盒子的球比其他球多,那並不重要。 – 2012-04-09 20:10:08

回答

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 
} 
+0

'flag =我 2012-04-09 21:47:00

+0

@ Eng.Fouad嘗試'flag = i Saphrosit 2012-04-09 21:48:46

+0

哦,是的!這是唯一正確工作的解決方案!感謝隊友爲此;) – 2012-04-09 21:51:54

3

您可以在第一個k-1箱子中分配(int)n/k球,其餘的箱子分配給最後一個箱子。這將是最簡單的代碼。

有了這個:boxCount += (i % (numOfBalls/numOfBoxes) == 0 && boxCount < numOfBoxes-1 ? 1 : 0)

+0

這會將3個球放入第一個盒子。 – 2012-04-09 20:42:09

+0

@DavidHarkness:當然了,謝謝。我錯誤地將我在第一行寫到+ =聲明的內容......現在正在做描述所描述的內容。然而,我看到這個問題被編輯,OP也在尋找更均勻分佈的東西 – amit 2012-04-09 21:23:03

+0

我試過了,但它給了我'A:[1]' 'B:[2]' 'C:[3, 4,5]' – 2012-04-09 21:48:06

1

好了,新的嘗試:

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

注意,球的索引編號爲0至4(如for循環) 。如果您希望boxCount爲零,請刪除+ 1

+0

'java.lang.IndexOutOfBoundsException:Index:3,Size:3' – 2012-04-09 21:48:53

+0

box A到C的索引是什麼?如果它是'0..2',則按照建議移除'+ 1'。 – matsev 2012-04-10 04:52:04

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(四捨五入)。

+0

這給了我:'A:[1]' 'B:[2,3]' 'C:[4]',它會丟棄'5' – 2012-04-09 21:50:03

+0

@ Eng.Fouad:對不起,用'<='在while條件下'<'。編輯應用。 – 2012-04-09 21:53:44

+0

感謝隊友,現在工作得很好。不過,我已經接受@ Saphrosit的回答,因爲他在你之前發佈了它:) – 2012-04-09 22:03:55

相關問題