C++二分查找实现:从力量数组中找出能挪动冰箱的最小力量值
我看到你的代码存在几个问题,我来帮你分析和修正。 ## 🔍 问题分析 1. **输入读取顺序错误**:你没有先读取 n 的值,就直接进入了 for 循环。 2. **边界条件处理不当**:当所有人都能挪动冰箱时(最小力量值 >= k),代码会出错。 3. **二分查找逻辑有缺陷**:当 a[mid] >= k 时,不能仅判断 a[mid-1] < k,还要考虑 mid == 1 的情况。 ## ✅ 修正后的代码 ```cpp #include <iostream> #include <algorithm> using namespace std; int n, a[100005], k, l, r, mid; int main() { // 1. 先读取人数 cin >> n; // 2. 读取力量值 for (int i = 1; i <= n; i++) { cin >> a[i]; } // 3. 读取冰箱重量 cin >> k; // 4. 排序 sort(a + 1, a + n + 1); // 5. 处理特殊情况:所有人都挪不动 if (a[n] < k) { cout << "没有人能挪动冰箱" << endl; return 0; } // 6. 二分查找 l = 1; r = n; while (l <= r) { mid = (l + r) / 2; if (a[mid] >= k) { // 检查是否是最小值 if (mid == 1 || a[mid - 1] < k) { cout << a[mid] << endl; break; } r = mid - 1; } else { l = mid + 1; } } return 0; } ``` ## 💡 关键修正说明 ### 1️⃣ 输入顺序修正 原代码在读取 n 之前就开始了 for 循环,导致读取的数据错位。 ### 2️⃣ 边界条件处理 - **情况1**:所有人都挪不动(最大力量值 < k)→ 需要特殊提示 - **情况2**:所有人都能挪动(最小力量值 >= k)→ 直接输出 a[1] - **情况3**:部分人能挪动 → 二分查找找到第一个 >= k 的值 ### 3️⃣ 二分查找优化 使用更简洁的写法: ```cpp // 更简洁的二分查找写法 int findMinStrength() { int left = 1, right = n, result = -1; while (left <= right) { int mid = left + (right - left) / 2; // 防止溢出 if (a[mid] >= k) { result = a[mid]; right = mid - 1; // 尝试找更小的 } else { left = mid + 1; } } return result; // 返回第一个 >= k 的值 } ``` ## 🎯 完整优化版代码 ```cpp #include <iostream> #include <algorithm> using namespace std; int main() { int n, a[100005], k; // 输入 cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } cin >> k; // 排序 sort(a, a + n); // 使用 lower_bound 函数直接查找 int* p = lower_bound(a, a + n, k); // 输出结果 if (p == a + n) { cout << "没有人能挪动冰箱" << endl; } else { cout << *p << endl; } return 0; } ``` ## 📝 开发建议 1. **使用标准库函数**:`lower_bound()` 可以直接找到第一个 >= k 的元素,比手写二分更安全 2. **注意数组索引**:建议统一使用从 0 开始的索引,避免混淆 3. **添加错误处理**:考虑所有可能的边界情况 4. **使用有意义的变量名**:提高代码可读性 ######[AI写代码神器 | 945点数解答 | 2026-06-07 20:18:35]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)415
- C++ 破解数字游戏:找出数组添加全排列后相同数字最大数量(字节豆包 | 456点数解答 | 2025-02-27 18:56:24)303
- C++助力小小李老师:求解数组添加排列后最多相同数字数量(字节豆包 | 424点数解答 | 2025-03-01 14:46:52)244
- C++助力小小李老师:破解数组数字游戏最高得分之谜(字节豆包 | 434点数解答 | 2025-03-05 07:50:34)265
- C++ 助力小小李老师玩转数字游戏,找出数组最大相同元素次数!(DeepSeek | 1118点数解答 | 2025-03-25 21:11:51)215
- C++ 助力小小李老师:解决数组添加排列找最大重复元素难题(DeepSeek | 833点数解答 | 2025-03-26 17:06:19)202
- C++助力小小李老师:破解数组排列数字游戏最高得分之谜(DeepSeek | 901点数解答 | 2025-03-26 17:08:11)200
- C++ 破解数字游戏:为数组添加排列找出最大相同元素数量(DeepSeek | 1815点数解答 | 2025-03-27 17:50:16)204
- C++ 助力小小李老师:找出数组添加排列后相同数字的最大数量 (DeepSeek | 762点数解答 | 2025-03-27 17:53:47)206
- 动态规划求解数组下标元素和最大值代码分析与优化(字节豆包 | 346点数解答 | 2026-03-16 17:56:30)43
- 旅行售货员问题:详细步骤剖析与贪心算法Python代码实现(字节豆包 | 444点数解答 | 2024-12-17 03:32:59)312
- Dev C++ 实现旅行售货员问题:最小路程路线代码与详细解析 (字节豆包 | 448点数解答 | 2024-12-17 03:33:42)206