C++实现计算探测器走过路程总和的代码及分析
### 🌟问题分析 本题的目标是计算所有探测器走过的路程总和。对于每个探测器,需要找到离它最近的管道口,然后计算探测器到该管道口的距离,最后将所有探测器走过的路程相加。 ### 💻代码实现 ```cpp #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int n, m; // 读取管道口的个数 n 和探测器的个数 m cin >> n >> m; vector<int> a(n); // 读取每个管道口到起点的距离 for (int i = 0; i < n; i++) { cin >> a[i]; } // 对管道口的距离进行排序 sort(a.begin(), a.end()); int sum = 0; for (int i = 0; i < m; i++) { int k; // 读取每个探测器落地时到起点的距离 cin >> k; int l = 0, r = n - 1; int mid; int ans = 0; // 二分查找离探测器最近的管道口 while (l < r) { mid = (l + r) / 2; if (a[mid] < k) { l = mid + 1; } else { r = mid; } } // 计算探测器到最近管道口的距离 ans = min(abs(k - a[l]), abs(k - (l > 0 ? a[l - 1] : a[l]))); // 将该探测器走过的路程累加到总和中 sum += ans; } // 输出所有探测器走过的路程总和 cout << sum << endl; return 0; } ``` ### 📝代码解释 1. **变量说明**: - `n`:管道口的个数。 - `m`:探测器的个数。 - `a`:存储每个管道口到起点的距离的数组。 - `k`:每个探测器落地时到起点的距离。 - `l` 和 `r`:二分查找的左右边界。 - `mid`:二分查找的中间位置。 - `ans`:当前探测器到最近管道口的距离。 - `sum`:所有探测器走过的路程总和。 2. **二分查找**: - 对管道口的距离数组 `a` 进行排序。 - 对于每个探测器的位置 `k`,使用二分查找找到离它最近的管道口。 - 计算探测器到最近管道口的距离,并累加到 `sum` 中。 ### ⚙️复杂度分析 - **时间复杂度**:排序的时间复杂度为 $O(n log n)$,二分查找的时间复杂度为 $O(m log n)$,因此总的时间复杂度为 $O(n log n + m log n)$。 - **空间复杂度**:主要使用了一个长度为 `n` 的数组来存储管道口的距离,因此空间复杂度为 $O(n)$。 ### 🚀开发建议 - **边界条件处理**:在二分查找时,需要注意边界条件,确保不会越界。 - **代码可读性**:可以添加适当的注释,提高代码的可读性。 - **错误处理**:可以添加输入验证,确保输入的合法性。 ######[AI写代码神器 | 800点数解答 | 2026-04-11 20:08:48]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)354
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)327
- Java 实现:轻松生成 5 位数字、大小写字母混合验证码( | 266点数解答 | 2024-03-06 17:39:10)336
- 深度剖析:游戏中两个 Buff 效果的触发条件、逻辑及注意要点 (阿里通义 | 566点数解答 | 2024-11-26 14:24:12)264
- 深度剖析 Vue 2 插槽:从基础使用到高级玩法(字节豆包 | 165点数解答 | 2024-11-29 11:25:06)221
- C++实现支持四则运算的简单计算器,处理除数为0和无效操作(字节豆包 | 241点数解答 | 2025-10-29 20:21:29)71
- C语言破解甲乙丙真假话谜题:开发中需留意的三大要点(字节豆包 | 444点数解答 | 2025-11-24 00:10:58)57
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)480
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)364
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)81
- C++ 实现根据输入正整数奇偶性计算偶数和或约数和(字节豆包 | 838点数解答 | 2026-02-28 20:23:59)36
- iOS开发:手把手教你完整实现代理模式,含声明与实现步骤!(阿里通义 | 268点数解答 | 2023-11-08 00:39:55)258