1.要求
工厂里有一批不同长度的木材(不考虑单位,且长度都是整数),此时客户需要定制一个总长度为整数M的木材。我们唯一能做的就是,把工厂这批木材底部对齐,然后取一个长度整数N,整体切割,将所有长度超过N的木材截成N,使得这批木材全部接在一起的总长度S最接近M(S减去M的绝对值最小)。
现给出一个整数数组,代表每根木材的长度,以及客户定制的长度M,求N(必须用上所有木材)(若有多个结果满足,返回最小的值)。
1.1示例
示例 1:
输入:A = [5,9,2], M = 11
输出:4
解释:当选择N为4时,数组会变成 [4, 4, 2],和为10;
当选择N为5时,数组会变成 [5, 5, 2],和为12;相同接近11的情况下,4更小。
示例 2:
输入:A= [2,4,6], M= 13
输出:6
2.问题分析
该题主要考察数组。
主要思路:
1)现有的木材为一个一维数组;
2)切割后的木材为一个二维数组;
3)木材切割后总长度为一个一维数组;
4)切割后木材总和与定制要求差值为一个一维数组。
3.代码实现
public class logTest {
public static void main(String[] args) {
int[] arr = new int[3];//现有木材
int maxNum = 0;
for (int i = 0; i < arr.length; i++) {
System.out.print("请输入工厂现有木材长度:");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
arr[i] = num;
if(num > maxNum){
maxNum = num;
}
}
System.out.print("请输入定制长度:");
Scanner scan = new Scanner(System.in);
int num2 = scan.nextInt();//定制长度
int[][] arr2 = new int[maxNum + 1][3];//切断木材长度集合
int[] sum = new int[maxNum + 1];//木材总和长度集合
int[] min = new int[maxNum + 1];
for (int i = 0; i <= maxNum; i++) {
for (int j = 0; j < arr.length; j++) {
if(arr[j] < i){
arr2[i][j] = arr[j];
}else{
arr2[i][j] = i;
}
}
}
// //遍历
// for (int i = 0; i < arr2.length; i++) {
// for (int j = 0; j < arr2[i].length; j++) {
// System.out.print(arr2[i][j] + " ");
// }
// System.out.println();
// }
for (int j = 0; j < sum.length; j++) {
for (int j2 = 0; j2 < arr.length; j2++) {
sum[j] += arr2[j][j2];
}
}
//遍历
// for (int i = 0; i < sum.length; i++) {
// if(i == 0){
// System.out.print("[" + sum[i] + ",");
// }else if (i == sum.length - 1){
// System.out.print(sum[sum.length - 1] + "]");
// }else{
// System.out.print(sum[i] + ",");
// }
// }
// System.out.println();
for (int j = 0; j < sum.length; j++) {
if (sum[j] == num2) {
min[j] = 0;
}else if (sum[j] < num2){
min[j] = num2 - sum[j];
}else{
min[j] = sum[j] - num2;
}
}
//遍历
// for (int i = 0; i < min.length; i++) {
// if(i == 0){
// System.out.print("[" + min[i] + ",");
// }else if (i == min.length - 1){
// System.out.print(min[min.length - 1] + "]");
// }else{
// System.out.print(min[i] + ",");
// }
// }
// System.out.println();
int n = 0;
int minNum = min[0];
int indexMin = -1;
for (int j1 = 0; j1 < min.length; j1++) {
if (min[j1] < minNum) {
minNum = min[j1];
indexMin = j1;
}
}
System.out.println("N = " + indexMin);
}
}