基础二分:华华拆木棍

图片说明

import java.io.*;
import java.util.*;

public class Main {
    static long a[];
    static int k,n;
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
         n = sc.nextInt();
         k = sc.nextInt();
        a = new long[n];
        for(int i = 0;i < n;i++){
            a[i] = sc.nextLong();
        }
        long l = 0;
        long r = 1000000009,mid;

        while(l < r - 1) {
            mid = (l + r) / 2;
            if(check(mid)){
                l = mid;
            }else {
                r = mid - 1;
            }
        }
        if(check(l + 1)){
            l++;
        }
        System.out.println(l);

    }

    public static boolean check(long x){
        int sum = 0;
        for(int i = 0;i < n;i++){
            sum+=(a[i] / x);
        }

        return sum >= k?true:false;
    }
}

这题做过,但是在比赛的时候忘记了,很遗憾。为了印象加深吧,在比赛的时候突然就想明白了,这里二分的不是数组,而是一个二分找出最合适的那一个条件,在这里需要找出的就是最打的长度。那么利用二分方法,加上自己写一个check函数,check这一个数作为拆分的条件,如果拆出来的数量符合题意那么返回true,那么继续用二分,找更大的长度,直到循环结束。循环结束后呢,可以再试一下l+1这一个条件,因为没有循环到,如果符合题意,那么l自加。

全部评论

相关推荐

05-07 13:29
已编辑
门头沟学院 Java
北斗导航Compass低仿版:能不能先搞清楚优先级啊,怎么可能是项目问题,项目很重要吗?又没学历 又没实习大厂凭啥约面?那玩具项目 没应用在真实生产环境下的 就算做上天又有什么用?早点找个小公司实习 拿小公司实习去投大厂实习,这才是你现在该做的
投递美团等公司10个岗位 简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务