如何根据n和g_max动态计算最大允许分组大小g_new
等规模分组最大单组阈值计算方案
首先明确核心约束:将总数为n的元素划分为若干组,单组大小不能超过g_max,求可使用的最大分组上限g_new。
两种常见场景的解法
场景1:允许分组大小差值≤1(通用等规模分组)
该场景是业务中最常用的,允许相邻分组大小最多差1,不需要严格完全等分。
算法步骤:
- 计算最少需要的分组数:
k = 向上取整(n / g_max),这一步是为了保证如果按g_max作为单组上限,不会出现超阈值的分组 - 用总元素数除以最少分组数再向上取整,得到最大可用分组阈值:
g_new = 向上取整(n / k)
示例验证:
- 题干示例:
n=110,g_max=25k = ceil(110/25) = 5g_new = ceil(110/5) = 22,和示例结果完全一致
- 非整除示例:
n=111,g_max=25k = ceil(111/25) =5g_new = ceil(111/5)=23,最终可分为2组23、3组22,所有组均不超过25,是最大的可行阈值
代码实现(Python):
import math def get_max_group_size(n: int, g_max: int) -> int: k = math.ceil(n / g_max) return math.ceil(n / k)
场景2:要求所有分组大小完全相等
该场景要求所有组的大小100%一致,没有差值。
算法逻辑:
g_new是n的最大正约数,且满足g_new ≤ g_max,可以从g_max倒序遍历到1,找到第一个能整除n的数值即为答案。
示例验证:
- 题干示例:
n=110,g_max=25,110的约数中≤25的最大值为22,符合要求
代码实现(Python):
def get_exact_equal_max_group(n: int, g_max: int) -> int: for g in range(g_max, 0, -1): if n % g == 0: return g return 1 # 边界兜底,1一定能整除所有正整数
内容的提问来源于stack exchange,提问作者sandeepsign
相关产品推荐
相关产品推荐

