标签:style sp for strong on 问题 html as size
问题描述
分析
若每个城市都先分得一个箱子,那么目前的答案就是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; }
标签:style sp for strong on 问题 html as size
原文地址:http://blog.csdn.net/colorwaterer/article/details/41898159