题目描述
按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木,所以只能在一些可以种植的点来种植树木。
在树苗有限的情况下,要达到最佳效果,就要尽量散开种植,不同树苗之间的最小间距要尽量大。给你一个适合种植树木的点坐标和一个树苗的数量,请帮小明选择一个最佳的最小种植间距。
例如,适合种植树木的位置分别为1,3,5,6,7,10,13 树苗数量是3,种植位置在1,7,13,树苗之间的间距都是6,均匀分开,就达到了散开种植的目的,最佳的最小种植间距是6。
输入描述
- 第1行表示适合种树的坐标数量
- 第2行是适合种树的坐标位置
- 第3行是树苗的数量
例如:
7
1 3 5 6 7 10 13
3
输出描述
最佳的最小种植问距。
补充说明
位置范围为1~ 10000000,种植树苗的数量范围2 ~ 10000000,用例确保种植的树苗数量不会超过有效种植坐标数量。
用例
示例1
输入:
7
1 3 5 6 7 10 13
3输出:
6
解题思路
- 先求理想状态下每米都有坑的情况下,按相等距离种植的 平均距离值(排除小数)。
- 再按照平均距离值递减的方式实验给定坐标可以种植多少棵数。
- 按上述方式计算当可种植树木的数量等于给定数量即为最佳种树距离。
- 理想平均值以上不可能满足栽种N棵数的条件,因此不考虑平均值以上的值。
题解
import java.util.Arrays;
import java.util.Scanner;
public class T50 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
// 适合种树的坐标数量
int m = sc.nextInt();
//适合种树的坐标位置
int[] data = new int[m];
for (int i = 0; i < data.length; i++) {
data[i] = sc.nextInt();
}
// 树苗的数量
int n = sc.nextInt();
int res = run(data, m, n);
System.out.println(res);
}
}
static int run(int[] data, int m, int n) {
// 先对数组进行排序
Arrays.sort(data);
// 计算平均分配后的间距
int mid = (data[m-1] - data[0])/(n-1);
// 可种植的最大距离
int maxLen = 0;
// 可种植的最大距离不会比平均值更大
for(int i= mid; i> 0; i--) {
int canPut = 1;
int lastIndex = 0;
for(int j = 1; j < m; j++) {
if(data[j] - data[lastIndex] >= i) {
canPut += 1; // 记录可种植的棵数
lastIndex = j; //记录上一棵树栽在什么位置
}
}
if(canPut == n) {
maxLen = i;
break;
}
}
return maxLen;
}
}