挑战程序设计竞赛(算法和数据结构)——5.6搜索的应用——计算最优解java实现

题目:
在这里插入图片描述

代码与思路:

import java.io.BufferedInputStream;
import java.util.Scanner;

public class _5_6 {

    public static void main(String[] args) {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        System.out.println("输入n和k:");
        int n = cin.nextInt();
        int k =cin.nextInt();
        int[] T = new int[100000];
        for(int i=0;i<n;i++){
            T[i] = cin.nextInt();
        }
        int ans = solve(T, n, k);
        System.out.println("最终结果为:" + ans);
    }

    //这是一个映射函数v = f(P),判断运载量关于装载货物的函数,是一个单调非降函数,可以运用查找。
    public static int check(int P, int[] T, int n, int k){
        int i = 0;//i用于记录当前装载货物的数量
        for(int j=0;j<k;j++){//对已有的每一辆车来判断是否装满了(由于货物是按照顺序给的,所以不用考虑货物之间的组合)
            int s = 0;//当前车辆的装载量
            while(s+T[i]<=P){//只要车辆的装载量没有达到上限,就继续装。否则就换下一辆车
                s += T[i];//装呗,容量增加
                i++;//装了货,装载货物量就要增加
                if(i==n)return n;//如果把能装的都装了,那就直接返回货物数量就可以了
            }
        }
        return i;
    }

    public static int solve(int[] T, int n, int k){
        //二分查找
        int left = 0;
        int right = 100000;
        int mid;
        while(right-left>1){//只要右左之间还隔着其他元素就不算停止
            mid = (right+left)/2;
            int v = check(mid,T, n, k);
            if(v>=n)right = mid;//只要查找的值超过了货物量n值
            else left = mid;
        }
        return right;//返回右侧的数值
    }
}

输入:

输入n和k:
5 3
8
1
7
3
9

输出:

最终结果为:10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值