方向一|理想火车站定位|豆包MarsCode AI刷题

106 阅读7分钟

理想火车站定位

问题描述

小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| + |y1 - y2|,即曼哈顿距离。

在初步考察后,市政府列出了M个可能的火车站建设点。为了使得市民到火车站的总旅行时间最短,小F希望选出一个最优位置作为火车站的地址。

请你帮助小F计算出哪一个位置最适合建设新火车站。

  • N: 市民的总人数。
  • M: 可建设火车站的备选位置数。
  • citizens: 一个列表,每个元素是一个元组 [x_i, y_i],表示第 i 位市民的居住位置。
  • locations: 一个列表,每个元素是一个元组 [p_i, q_i],表示第 i 个备选的火车站位置。

如果有多个火车站最优,那么选择第一次出现的那个。


测试样例

样例1:

输入:n = 4,m = 3,citizens = [[-1, -1], [-1, 1], [1, -1], [1, 1]],locations = [[3, 2], [1, 0], [0, 0]]
输出:[1, 0]

样例2:

输入:n = 2,m = 2,citizens = [[0, 0], [0, 4]],locations = [[0, 2], [0, 3]]
输出:[0, 2]

样例3:

输入:n = 3,m = 1,citizens = [[10, 10], [20, 20], [30, 30]],locations = [[15, 15]]
输出:[15, 15]

样例4:

输入:n = 5,m = 3,citizens = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]],locations = [[4, 5], [6, 7], [8, 9]]
输出:[4, 5]

样例5:

输入:n = 6,m = 2,citizens = [[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60]],locations = [[35, 35], [45, 45]]
输出:[35, 35]

题目解析

在这个问题中,我们需要找到一个最优的火车站建设位置,使得所有市民到该位置的总曼哈顿距离最小。具体步骤可以分为以下几个部分:

‌输入理解‌:

N:市民的总人数。 M:可建设火车站的备选位置数。 citizens:一个包含市民居住位置的列表,每个元素是一个元组 [x_i, y_i]。 locations:一个包含备选火车站位置的列表,每个元素是一个元组 [p_i, q_i]。

‌计算总曼哈顿距离‌:

对于每一个备选火车站位置,计算所有市民到该位置的总曼哈顿距离。 选择总曼哈顿距离最小的那个位置作为最优火车站位置。

‌实现细节‌:

遍历每一个备选位置。 对每一个备选位置,计算它与所有市民位置的曼哈顿距离之和。 记录最小距离及其对应的位置。

具体实现步骤

‌初始化最小距离‌为一个非常大的数(例如无穷大)。

‌遍历‌所有备选火车站位置:

对于当前备选位置,计算所有市民到该位置的总曼哈顿距离。 如果该总距离小于当前最小距离,则更新最小距离和最优位置。 ‌返回‌最优位置。

代码实现:

public class Main { public static int[] solution(int n, int m, int[][] citizens, int[][] locations) { // Please write your code here return new int[]{-1, -1}; }

public static boolean arrayEqual(int[] a, int[] b) {
    if (a.length!= b.length) {
        return false;
    }
    for (int i = 0; i < a.length; i++) {
        if (a[i]!= b[i]) {
            return false;
        }
    }
    return true;
}

public static void main(String[] args) {
    // You can add more test cases here
    int[][] citizens1 = {{-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
    int[][] locations1 = {{3, 2}, {1, 0}, {0, 0}};

    int[] result = solution(4, 3, citizens1, locations1);
    int[] expected = {1, 0};
    System.out.println(arrayEqual(result, expected));
}

}

‌代码详解‌

‌Main类和solution方法‌:Main 类中包含一个 solution 方法,该方法接收市民和备选火车站位置,应返回最优火车站位置。当前实现默认返回 {-1, -1}。 ‌arrayEqual方法‌:用于比较两个数组是否相等。 ‌main方法‌:包含一个测试用例,测试 solution 方法的输出是否与预期相符。

‌知识总结‌

‌1.贪心算法‌:可能适用于解决类似“分发鱼干”的问题,即根据一定规则分配资源,使总满足特定条件(如‌中根据猫的等级分配鱼干)。 ‌2.静态成员‌:在类中使用 static 关键字声明的成员属于类本身,而非类的实例。它们只有一个副本,可以通过类名直接访问‌ 3.整数溢出‌:在Java中,整数运算结果超出类型范围会导致溢出,且Java不会报告溢出错误‌

学习计划:

一、制定刷题计划

‌设定明确目标‌: 确定想要达到的学习水平,比如通过某个编程竞赛、掌握特定算法或数据结构等。 设定每天、每周、每月的刷题量,确保目标既具有挑战性又可实现。

分阶段进行‌: 基础阶段‌:从简单题目开始,熟悉基本语法和常见算法。 ‌进阶阶段‌:挑战中等难度的题目,深化对算法和数据结构的理解。 ‌高级阶段‌:尝试解决复杂问题,提升解决问题的能力和思维灵活性。

合理安排时间‌: 分配固定的时间用于刷题,比如每天晚上8点到10点。 利用碎片时间复习错题和笔记。

定期评估与调整‌: 每周或每月评估一次学习进度,根据实际情况调整刷题计划。 如果发现某个知识点掌握不牢固,应增加相关题目的练习量。

二、利用错题进行针对性学习

建立错题本‌: 在豆包MarsCode AI刷题时,遇到错题不要立即查看答案,先尝试自己解决。 将无法解决的错题记录下来,包括题目、错误原因和正确解法。

分析错误原因‌: 对每道错题进行深入分析,找出错误原因,如算法理解不透彻、边界条件考虑不全等。

定期复习‌: 每周至少复习一次错题本,重新做一遍错题,确保真正掌握。 对于反复出错的题目,应重点标记并加强练习。

‌总结规律‌: 归纳错题中涉及的常见知识点和算法,总结解题规律和技巧。

三、工具运用:结合AI刷题功能与其他学习资源

‌利用AI刷题功能‌: 充分利用豆包MarsCode AI的刷题功能,根据难度和知识点选择题目进行练习。 利用AI的智能推荐功能,发现并解决自己的薄弱环节。

‌结合视频教程‌: 对于难以理解的知识点,可以观看相关视频教程,如算法讲解、数据结构分析等。 视频教程可以帮助你更直观地理解算法原理和实现过程。

‌参与社区讨论‌: 加入编程社区或论坛,与其他学习者交流解题思路和经验。 参与讨论可以帮助你拓宽思路,发现新的解题方法。

‌利用在线资源‌: 访问编程相关的在线资源,如博客、教程网站等,获取更多的学习材料和实例代码。 这些资源可以帮助深入理解算法和数据结构,提升编程能力。 四、实用的学习建议

‌保持耐心和毅力‌: 刷题是一个长期的过程,需要持之以恒地练习才能取得进步。 耐心分析每道题目,逐步提升自己的能力。

‌注重基础‌: 坚实的基础是解决复杂问题的关键。不要忽视基础知识和基本算法的学习。

‌多思考多总结‌: 在刷题过程中,要多思考问题的本质和解决方法。 定期总结学习经验和解题技巧,形成自己的知识体系。

‌保持好奇心和求知欲‌: 对编程和算法保持好奇心,不断探索新的技术和方法。 积极参加编程竞赛和活动,挑战自己的极限。