牛客NC382 切割木头【中等 二分超找 Java/Go/C++】

题目

题目链接:

https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0

核心

复制代码
 二分查找

Java代码

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param a int整型一维数组
     * @param k int整型
     * @return int整型
     */
    public int cutWood (ArrayList<Integer> ll, int k) {
        if (ll == null || ll.size() == 0) return 0;
        int[] a = new int[ll.size()];
        for(int i=0;i<ll.size();i++){
            a[i] = ll.get(i);
        }
        int L = 1; //数据合法的情况下,长度为1的是最多
        int R = 0;
        long total = 0;
        for (int i : a) {
            total += i;
            R = Math.max(R, i);
        }

        if (total < k) return 0;

        while (L < R) {
            int m = L + (R - L + 1) / 2;
            long cur = binarySearch(a, m);
            if (cur < k) {
                R = m - 1;
            } else {
                L = m;
            }
        }

        return L;
    }
    public long binarySearch(int[] arr, int m) {
        long cnt = 0;
        for (int i : arr) {
            cnt += i / m;
        }
        return cnt;
    }
}

Go代码

go 复制代码
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param a int整型一维数组
 * @param k int整型
 * @return int整型
 */
func cutWood(a []int, k int) int {
	if a == nil || len(a) == 0 {
		return 0
	}

	L := 1 //数据合法的情况下,长度为1的时候是能切最多数量的
	R := 0
	total := 0
	for _, t := range a {
		total += t
		if t > R {
			R = t
		}
	}

	if total < k {
		return 0 //数据不合法
	}

	for L < R {
		m := L + (R-L+1)/2
		cur := binarySearch(a, m)

		if cur < k {
			R = m - 1
		} else {
			L = m
		}
	}
	return L
}

func binarySearch(arr []int, m int) int {
	cnt := 0
	for _, t := range arr {
		cnt += t / m
	}
	return cnt
}

C++代码

cpp 复制代码
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param a int整型vector
     * @param k int整型
     * @return int整型
     */
    int cutWood(vector<int>& a, int k) {
        if (a.size() == 0)
            return 0;

        int L = 1; //数据合法的情况下,长度为1能切到最多数量的k【假设k是变动的】
        int R = 0;
        int total = 0;

        for (int i = 0; i < a.size(); i++) {
            int cur = a[i];
            total += cur;
            if (cur > R) {
                R = cur;
            }
        }

        while (L < R) {
            int m = L + (R - L + 1) / 2;
            int cur = binarySearch(a, m);
            if (cur < k) {
                R = m - 1;
            } else {
                L = m;
            }
        }
        return L;
    }

    int binarySearch(vector<int>& arr, int m) {
        int cnt = 0;
        for (int i = 0; i < arr.size(); i++) {
            cnt += arr[i] / m;
        }
        return cnt;
    }
};
相关推荐
小O的算法实验室29 分钟前
2026年ACM TCH,动态救护车路径优化:结合 K-means 聚类与多目标粒子群算法两阶段策略
算法
在书中成长33 分钟前
HarmonyOS 小游戏《对战五子棋》开发第8篇 - GomokuEngine核心引擎设计(三):五子连珠判定算法
算法·华为·harmonyos
Let's Chat Coding1 小时前
MAC 消息认证码:同时验证来源和完整性
算法·哈希算法
cc.ChenLy3 小时前
算法从入门到精通实战指南
算法
Jerry9 小时前
LeetCode 160. 相交链表
算法
Jerry10 小时前
LeetCode 19. 删除链表的倒数第 N 个结点
算法
金銀銅鐵10 小时前
费马小定理
python·数学·算法
技术不好的崎鸣同学11 小时前
[ACTF2020 新生赛]Exec 思路及解法
算法·安全·web安全
Full Stack Developme13 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法