一、题目描述
一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址,使服务中心到所有区域的距离的总和最小。
给你一个数组 positions,其中 positions[i] = [left, right] 表示第 i 区域在街道上的位置,其中left 代表区域的左侧的起点,right 代表区域的右侧终点。
假设服务中心的位置为 location:
- 如果第 i 个区域的右侧终点 right 满足 right< location,则第 i 个区域到服务中心的距离为location - right;
- 如果第 i 个区域的左侧起点 left 满足 left> location,则第 i 个区域到服务中心的距离为 left -location;
- 如果第 i 个区域的两侧 left,right 满足 left <= location <= right,则第 i 个区域到服务中心的距离为 0;
选择最佳的服务中心位置为 location,请返回最佳的服务中心位置到所有区域的距离总和的最小值;
二、输入描述
第一行,一个整数 N 表示区域个数;
后面 N 行,每行两个整数,表示区域的左右起点终点;
三、输出描述
运行结果输出一个整数,表示服务中心位置到所有区域的距离总和的最小值。
四、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 区域个数
int n = sc.nextInt();
// 每行两个整数,表示区域的左右起点终点
double[][] arr = new double[n][2];
for (int i = 0; i < n; i++) {
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
}
System.out.println(getValue(n, arr));
}
public static int getValue(int n, double[][] arr) {
ArrayList<Double> tmp = new ArrayList<>();
for (double[] pos : arr) {
tmp.add(pos[0]);
tmp.add(pos[1]);
}
tmp.sort(Double::compareTo);
double min = tmp.get(0);
double max = tmp.get(tmp.size() - 1);
double ans = Double.MAX_VALUE;
for (double i = min; i <= max; i += 0.5) {
double dis = 0;
for (double[] pos : arr) {
double l = pos[0];
double r = pos[1];
if (r < i) dis += i - r;
else if (i < l) dis += l - i;
}
ans = Math.min(ans, dis);
}
return (int)ans;
}
五、效果展示
1、输入
3
10 20
30 40
50 60
2、输出
30
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。