广州荔湾区网站建设/1688网站
一、题目描述
一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址,使服务中心到所有区域的距离的总和最小。
给你一个数组 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机考。专栏会持续更新,每天在线答疑。