牛牛可以对任意一堆石子数量大于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