问题描述:
有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。
输入格式:
第一行两个整数N,M。
一行N个整数,表示木棍的长度。
输出格式:
一行一个整数,表示最小的差距
样例输入:
3 2
10 20 40
样例输出:
10
数据规模和约定:
N, M<=7
思路:
将原小木棍数组排序,然后将m大(最大的m个数)的木棍放入长木棍数组,每次将剩余短木棍中最大的粘在长木棍数组最小的木棍上,再将长木棍数组重新排序,再次粘短木棍中最长的木棍,这样保证最终长木棍数组中的最长和最短之差最小。
PS:我也看了其他博主的对于N和M情况的讨论,(N=M,N>M)的情况,这里都包含在内的,只有N<M的情况未考虑,但是该题蓝桥杯的测试用例中未包含该情况,友友们若加上也可以,即
if(n<m){
System.out.println("0");
return;
}
将m大的木棍放入长木棍数组,从数组末尾开始添加,tm临时代替m,充作长木棍数组长度
Arrays.sort(a); // 将小木棍排序
int[] ls = new int[m]; // 新建长木棍数组
int tm = m; // 如果直接用m,m就会变化
for (int i=n-1;i>=0;i--){ // 将最长的几根放入长木棍数组
ls[--tm] = a[i];
if (tm==0)
break;
}
粘木棍:我是直接在原小木棍数组中进行处理(n-m-1)是去掉长木棍后,最长短木棍的位置。(初学者这里也可以再新建一个新的数组来存放剩余短木棍,便于理解)
for (int j=n-m-1;j>=0;j--){ // 每次将剩下短木棍最长的拼在长木棍最短的上面再重新排序
ls[0] += a[j];
Arrays.sort(ls);
}
完整代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 输入n和m
int m = sc.nextInt();
int[] a = new int[n]; // 创建小木棍数组
for (int i=0;i<n;i++){
a[i] = sc.nextInt(); // 输入数据
}
Arrays.sort(a); // 将小木棍排序
int[] ls = new int[m]; // 新建长木棍数组
int tm = m; // 如果直接用m,m就会变化
for (int i=n-1;i>=0;i--){ // 将最长的几根放入长木棍数组
ls[--tm] = a[i];
if (tm==0)
break;
}
for (int j=n-m-1;j>=0;j--){ // 每次将剩下短木棍最长的拼在长木棍最短的上面再重新排序
ls[0] += a[j];
Arrays.sort(ls);
}
System.out.println(ls[m-1]-ls[0]);
}
}