首页 > 编程语言 >二分搜索算法-吃香蕉问题

二分搜索算法-吃香蕉问题

时间:2024-08-21 13:50:28浏览次数:7  
标签:二分 香蕉 piles int max count 搜索算法 pile speed

题目:

      输入一个长度为N的正整数数组piles代表N堆香蕉,piles[i]代表第i堆香蕉的数量,现在要在H小时内吃完之这些香蕉,请求假设吃香蕉的速度为k,而且每小时最多吃一堆香蕉,如果吃不下的话留下到下一个小时再吃,如果吃完后这堆后,如果还有胃口,也要等待下一个小时才能吃下一堆。

求最小的k

分析:

1)一堆香蕉N,每小时吃K个,则一堆需要多久呢?

如果N%k=0,则需要N/k 小时

如果N%k!=0.则需要N/k + 1小时

2) 此问题最直接的解法是,k从1遍历到max(piles[i]),因为再大已经没有意义,最多一小时只能吃一堆,针对每个值计算是否可以在H小时吃完,计算第一个满足的k,则是最小的k

 

/**
 * 有n堆食物,在H小时内吃完,每小时吃多少个食物,最小的值是多少
 */
public class MinEatingSpeed {


    public static void main(String[] args) {

        int[] piles = new int[5];
        int H = 5;
        piles[0] = 10;
        piles[1] = 20;
        piles[2] = 30;
        piles[3] = 40;
        piles[4] = 50;
        System.out.println(minEatingSpeed(piles,H));
 
    }


    public static int minEatingSpeed(int[] piles, int H) {
        int max = max(piles);
        for (int speed = 1; speed < max; speed++) {
            if(canFinish(piles,speed,H)){
                return speed;
            }
        }
        return max;
    }

    public static Boolean canFinish(int[] piles,int speed,int H){
        int count = 0;
        for (int pile : piles) {
            count = count + ((pile%speed)==0?pile/speed:(pile/speed) + 1);
//            System.out.println("pile=" + pile + " speed=" + speed + " (pile%speed)==0?pile/speed:(pile/speed) + 1=" + (count + (pile%speed)==0?pile/speed:(pile/speed) + 1));
//            count = count + (pile/speed) + ((pile%speed)>0?1:0);
        }
        return count<=H;
    }


    public static int max(int[] piles){
        int max=0;
        for (int pile : piles) {
            if(pile>max){
                max=pile;
            }
        }
        return max;
    }
}

  3)k从1开始找到max速度不够快,可以采用二分查找的方法,比如如果max=100,使用50,发现能在H小时内吃完,则k最小值,应该在1~50内,否则在50~100内,再次缩小到25,12,6 比直接从1遍历要快很多

/**
 * 有n堆食物,在H小时内吃完,每小时吃多少个食物,最小的值是多少
 */
public class MinEatingSpeed {


    public static void main(String[] args) {

        int[] piles = new int[5];
        int H = 5;
        piles[0] = 10;
        piles[1] = 20;
        piles[2] = 30;
        piles[3] = 40;
        piles[4] = 50;
  
        //二分查找
        System.out.println(minEatingSpeed2(piles,H));

    }

    public static int minEatingSpeed2(int[] piles, int H) {

        int left = 1;
        int right = max(piles) + 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if(canFinish(piles,mid,H)){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }



    public static Boolean canFinish(int[] piles,int speed,int H){
        int count = 0;
        for (int pile : piles) {
            count = count + ((pile%speed)==0?pile/speed:(pile/speed) + 1);
//            System.out.println("pile=" + pile + " speed=" + speed + " (pile%speed)==0?pile/speed:(pile/speed) + 1=" + (count + (pile%speed)==0?pile/speed:(pile/speed) + 1));
//            count = count + (pile/speed) + ((pile%speed)>0?1:0);
        }
        return count<=H;
    }


    public static int max(int[] piles){
        int max=0;
        for (int pile : piles) {
            if(pile>max){
                max=pile;
            }
        }
        return max;
    }
}

  

标签:二分,香蕉,piles,int,max,count,搜索算法,pile,speed
From: https://www.cnblogs.com/yangh2016/p/18371424

相关文章

  • 基础数据结构——二分算法及时间复杂度
    这个算法的前提是,数组是升序排列的算法描述:i和j是指针可以表示查找范围m为中间值当目标值targat比m大时,设置查找范围在m右边:i=m-1当目标值targat比m小时,设置查找范围在m左边:j=m+1当targat的值等于m时,返回m的下标如果最终没找到就返回-1;算法实现:publicintbir......
  • 力扣热题100_二分查找_74_搜索二维矩阵
    文章目录题目链接解题思路解题代码题目链接74.搜索二维矩阵给你一个满足下述两条属性的mxn整数矩阵:每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数target,如果target在矩阵中,返回true;否则,返回fa......
  • 二分查找法
    二分查找法定义:二分查找也称折半查找(BinarySearch),它是一种效率较高的查找方法。前提:​1.必须采用顺序存储结构。​2.必须按关键字大小有序排列。我们以一个练习题为例:假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.思路:可设三个变量front,mid,end分别指向数据......
  • 【C++二分查找 前缀和 】1292. 元素和小于等于阈值的正方形的最大边长
    本文涉及的基础知识点C++二分查找C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例包括课程视频LeetCode1292.元素和小于等于阈值的正方形的最大边长给你一个大小为mxn的矩阵mat和一个整数阈值threshold。请你返回元素总和小于或等于阈值的正方形区......
  • 信息学奥赛初赛天天练-69-NOIP2017普及组-完善程序2-切割绳子、二分答案、二分边界、
    1完善程序(单选题,每小题3分,共30分)切割绳子有n条绳子,每条绳子的长度已知且均为正整数。绳子可以以任意正整数长度切割,但不可以连接。现在要从这些绳子中切割出m条长度相同的绳段,求绳段的最大长度是多少。(第一、二空2.5分,其余3分)输入:第一行是一个不超过100的正整数n,......
  • wqs 二分
    感觉是一个很神秘的东西。例题P2619[国家集训队]TreeI从\(m\)条边中选\(n-1\)条要求选恰好\(k\)条白边,且边集是原图生成树求边权和的最小值这题不算是dp,但还是记\(f_i\)为恰好选\(i\)条白边的最小代价。而wqs二分的要求是函数要具有凸性。简单版本就是选......
  • 粒子群算法和引力搜索算法的混合算法(PSOGSA)优化BP神经网络原理及matlab代码
    目录0引言1数学模型2模型对比3matlab代码3.1伪代码示意图3.2PSOGSA-BP4视频讲解0引言基于已发表智能算法文献研究,SeyedaliMirjalili等人在发现PSO的开发能力与GSA的探索能力有者较好结合性能,因此基于二者算法优势点提出混合算法PSOGSA。该算法主要利用PSO鸟......
  • 粒子群算法和引力搜索算法的混合算法(PSOGSA)优化长短期记忆神经网络原理及matlab代码
    目录0引言1数学模型2模型对比3matlab代码3.1伪代码示意图3.2PSOGSA-LSTM4视频讲解0引言基于已发表智能算法文献研究,SeyedaliMirjalili等人在发现PSO的开发能力与GSA的探索能力有者较好结合性能,因此基于二者算法优势点提出混合算法PSOGSA。该算法主要利用PSO......
  • 粒子群算法和引力搜索算法的混合算法(PSOGSA)优化支持向量机原理及matlab代码
    目录0引言1数学模型2模型对比3matlab代码3.1伪代码示意图3.2PSOGSA-SVM4视频讲解0引言基于已发表智能算法文献研究,SeyedaliMirjalili等人在发现PSO的开发能力与GSA的探索能力有者较好结合性能,因此基于二者算法优势点提出混合算法PSOGSA。该算法主要利用PSO......
  • 【C++二分查找】1954. 收集足够苹果的最小花园周长
    本文涉及的基础知识点C++二分查找LeetCode1954.收集足够苹果的最小花园周长给你一个用无限二维网格表示的花园,每一个整数坐标处都有一棵苹果树。整数坐标(i,j)处的苹果树有|i|+|j|个苹果。你将会买下正中心坐标是(0,0)的一块正方形土地,且每条边都与两条坐......