酷代码 AI
菜单
服务商
DeepSeek字节豆包
更多选项

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]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]