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

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——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

以上是关于挑战程序设计竞赛(算法和数据结构)——5.6搜索的应用——计算最优解java实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——12.4广度优先搜索的JAVA实现

挑战程序设计竞赛(算法和数据结构)——9.2二叉搜索树插入的JAVA实现

挑战程序设计竞赛(算法和数据结构)——9.4二叉搜索树删除的JAVA实现

挑战程序设计竞赛(算法和数据结构)——12.3深度优先搜索的JAVA实现

挑战程序设计竞赛(算法和数据结构)——6.2穷举搜索,分治法JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.1八皇后问题的JAVA实现