会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
把每个数除以除数 d 再向上取整后求和,要求这个和不超过 threshold,求最小的正整数 d。
- 除数变大时,每一项 ⌈numsi/d⌉ 只减不增,总和也单调不增,因此满足阈值的 d 构成一段后缀。
- d=1 时和最大,d=max(nums) 时每一项都是 1,和等于 n,而 threshold≥n,所以一定有解,搜索区间取 [1,max(nums)] 即可。
- 判定:对固定 d,用 (x+d−1)/d 算向上取整。和可能到 n×106,要用 64 位整数。
- 常见假解:向下取整、二分写反(找最大而不是最小)、用
int 累加溢出。
题目内容
给你一个整数数组 nums 和一个正整数 threshold,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。
请你找出能够使上述结果小于等于阈值 threshold 的除数中最小的那个。
每个数除以除数后都向上取整,比方说 7/3=3,10/2=5。
题目保证一定有解。
输入描述
第一行两个整数 n 和 threshold(1≤n≤5×104,n≤threshold≤106)。
第二行 n 个整数 nums1,nums2,…,numsn(1≤numsi≤106)。
输出描述
输出一个整数,表示满足条件的最小除数。
样例1
输入
4 6
1 2 5 9
输出
5
说明
- 除数为 1 时,和为 17(1+2+5+9)。
- 除数为 4 时,和为 7(1+1+2+3)。
- 除数为 5 时,和为 5(1+1+1+2)。
样例2
输入
5 11
2 3 5 7 11
输出
3
样例3
输入
1 5
19
输出
4