牛牛可以对任意一堆石子数量大于1的石子堆进行分裂操作,分裂成两堆新的石子数量都大于等于1的石子堆。
现在牛牛需要通过分裂得到m堆石子,他想知道这m堆石子的最小值最大可以是多少?
3,5,[3,5,6]
2
把5分裂成2和3把6分裂成2和4得到五堆石子[3,2,3,2,4]
第一个参数n代表石子堆的个数
第二个参数m表示需要得到的石子堆数。
第三个参数vector a代表每堆石子堆的石子个数
class Solution { public: /** * 分石子 * @param n int整型 * @param m long长整型 * @param a int整型vector * @return int整型 */ int solve(int n, long long m, vector<int>& a) { int l=1, r=*min_element(a.begin(), a.end())+1; while(l+1<r){ int mid = (l+r)>>1; long long k=0; for(auto &x: a) k += x/mid; if(k < m) r = mid; else l = mid; } return l; } };
# # 分石子 # @param n int整型 # @param m long长整型 # @param a int整型一维数组 # @return int整型 # class Solution: def solve(self , n , m , a ): # write code here if n == m: return min(a) left, right = 1, min(a) while left<right: mid = (left+right+1) >> 1 total = sum(nums//mid for nums in a) if total >= m: left = mid else: right = mid-1 return left