题目如下
数据范围
示例
令糖果总数为sum sum和k有三种关系:
1.当sum < k时每个小孩只能空手而归
2.当sum == k时每个小孩只能分配一个糖果
3.当sum > k时每个小孩至少可以分配一个糖果最多可以分配糖果最大的那堆(如:candi(2,1,1)k = 1那么显然可以分配2个糖果)当然这里最多指的是理论上有些时候实际情况不允许。那么当糖果足够分配n个的时候我们便可以考虑n+1是不是也能分配,所以我们可以从1开始枚举理论分配数然后通过计算验证是不是可行的。
因为一堆糖果的数量可能有10的7次方所以我们不能按照线性的速度去枚举这里可以选择使用二分查找来加速到logn。
通过代码
class Solution {
public:
bool check(vector<int>& nums,long long k,long long v){
int n = nums.size();
long long c = 0;
for(int i = 0;i < n;i++){
c += (long long)nums[i]/v;
}
return c >= k;
}
int maximumCandies(vector<int>& candies, long long k) {
int max1 = -1;
long long sum = 0,mid;
int n = candies.size();
for(int i = 0;i < n;i++){
max1 = max(max1,candies[i]);
sum += candies[i];
}
if(sum < k)return 0;
if(sum == k)return 1;
int l = 1,r = max1;
while(l < r){
mid = (l + r + 1)/2;
if(check(candies,k,mid))l = mid;
else r = mid - 1;
}
return l;
}
};