挑战程序设计竞赛(算法和数据结构)——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实现