分石子

最优解

看到要使得最小值最大,则想到二分答案。
二分这个最小值,现在判断是否可以分出m份大于等于这个最小值的石堆。直接枚举每一堆石子然后看能分出几堆满足条件的石堆即可。
二分次数上界为,每次检查的复杂度为,总的时间复杂度
只使用了常数个临时变量,空间复杂度

int solve(int n, long long m, vector<int> &a){
    assert(a.size() == n);
    int l = 1, r = 1e9;
    for(int i = 0; i < n; ++i) r = min(r, a[i]);
    int ans = 1;
    while(l <= r){
        int mid = (r+l)/2;
        long long sum = 0;
        for(int i = 0; i < n; ++i) sum += a[i]/mid;
        if(sum < m) r = mid-1;
        else ans = mid, l = mid+1;
    }return ans;

}
全部评论

相关推荐

头像
11-09 17:30
门头沟学院 Java
TYUT太摆金星:我也是,好几个华为的社招找我了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务