分石子

最优解

看到要使得最小值最大,则想到二分答案。
二分这个最小值,现在判断是否可以分出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;

}
全部评论

相关推荐

06-12 16:23
已编辑
小米_软件开发(准入职员工)
点赞 评论 收藏
分享
牛客92804383...:在他心里你已经是他的员工了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务