leetcode 2226. 每个小孩最多能分到多少糖果

题目如下
在这里插入图片描述
数据范围
在这里插入图片描述
示例
在这里插入图片描述

令糖果总数为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;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值