分析
若每個城市都先分得一個箱子,那麼目前的答案就是max(Ai(1<=i<=n))。所以,我們必須要給最大值的那個城市還需要至少分配一個箱子,那麼答案肯定不再是那個城市(也有可能有某個城市的人數跟該城市人數一樣,那麼答案還是沒變)。
接下來如果你還有箱子,你肯定要給次大值的那個城市至少再分配一個箱子;
接下來如果你還有箱子,你肯定要給次次大值的那個城市至少再分配一個箱子;
接下來如果你還有箱子,你肯定要給次次次大值的那個城市至少再分配一個箱子;
接下來如果你還有箱子,你肯定要給次次次次大值的那個城市至少再分配一個箱子;
。。。
直到什麼時候呢?
直到原先那個最大值城市的票數的一半(奇數需要再加1)大於等於了你剛剛從大到小排列的城市的那個票數,為什麼?
因為那個城市的後面的票數肯定小於等於那個城市,那麼這些城市中沒有一個票數是比那個最大值城市的票數的一半還要大,也就是說當前狀態下,所有城市中,原先那個最大值城市的票數的一半成了當前最大值。
解題:你想到了什麼?——二分!
我們二分票數,票數范圍是1到某個城市的最大票數。
記l=1, r=max,那麼mid=(1+max)/2;
假設mid就是答案,那麼我們需要統計一下一共需要幾個箱子。
int num = 0; for (int i = 1; i <= n; i++) { if (a[i] % mid) num += a[i] / mid + 1; else num += a[i] / mid; }