2013-12-14 46 views
1

作爲最近的topcoder SRM問題的一部分,我們必須計算攜帶「N」個人的總線「B」的數量,因爲每輛公交車都有「S」個座位。一個計算技巧來計算例如爲每個盒子放置N個對象所需的盒子數量可以容納M個對象嗎?

在C++中計算這個最聰明的方法是什麼? 最顯而易見的方法是做:

if(N%S==0){B=N/S;} 
else{ B=N/S + 1;} 

^所有變量是整數,N和S ASSIGNED適當值

但是我無法理解下面的代碼是一個特定的TopCoder用戶的解決方案背後的邏輯,我正在檢查;

B = (N + (S-1))/S; 

這是如何工作的?

+1

一些測試值嘗試(例如S = 4,和N = 4,5,6,7,8),和你會看到它是如何工作的。 –

+0

謝謝,我想我明白了:) ... – Nischal

+1

我認爲你的「顯而易見」方法的'if'條件應該是'N%S == 0'。至於哪個解決方案更好?很難說。我認爲在實踐中沒有人會注意到兩者之間的性能差異,除非它恰好處於一些性能關鍵循環的中間。 –

回答

1

代碼

B = (N + (S-1))/S; 

是一種常見的舍入特技。我們知道在整數除法中,餘數是截斷的,本質上是什麼floor。在這種情況下,我們通過首先添加S-1來執行ceil操作。

這是類同四捨五入浮點數的常見方法:

n = floor(n + 0.5); 
相關問題