测试数据:
二分答案-知识总结 基本概念 二分答案(Binary Search the Answer)是二分查找算法的一种扩展应用,用于解决优化问题,特别是在问题的可能答案可以按序排列且可以进行“是或否”判定的情况下。这种技术通常用于在一个连续或离散的有序空间中寻找最优解。
二分答案技术的核心在于使用二分查找思想,通过对答案的范围进行不断缩小,快速逼近目标解。这种方法要求问题的解空间具有单调性,即解的有效性是单调的(非递增或非递减),从而可以明确地决定搜索范围的缩小方向。
工作原理 确定范围:首先确定答案可能存在的最小值 low 和最大值 high。 中间值判断:计算中间值 mid = (low + high) / 2,然后判断 mid 是否为可行解。 调整范围: 如果 mid 是一个可行解,则根据问题的需要(求最小值还是最大值),调整 low 或 high: 如果我们需要最小的可行解,且 mid 可行,那么就将 high 调整为 mid。 如果我们需要最大的可行解,且 mid 可行,那么就将 low 调整为 mid + 1。 如果 mid 不可行,则相反地调整 low 或 high。 重复过程:重复上述过程,直到 low 和 high 的区间缩小到满足条件的程度(通常是 low 和 high 相遇)。
应用 容量最小化问题:例如,确定最小的船只容量,使得所有货物都可以在限定次数内运送完毕。 速度最大化问题:寻找最大速度,使得在这个速度或更低的速度下,完成某项任务的时间仍然可以接受。 经济/成本问题:找到最少的投资额,使得可以获得预期的利润或效果。
示例代码 以下是一个利用二分答案技术解决“木材切割”问题的示例。问题是:给定一组木材长度,需要切割出至少 K 段指定长度的木材,求这个长度的最大值。
1#include <iostream>
2#include <vector>
3
4using namespace std;
5
6int findFirst(const vector<int>& nums, int target) {
7 int low = 0, high = nums.size() - 1;
8 int first = -1;
9 while (low <= high) {
10 int mid = low + (high - low) / 2;
11 if (nums[mid] >= target) {
12 if (nums[mid] == target) first = mid;
13 high = mid - 1;
14 } else {
15 low = mid + 1;
16 }
17 }
18 return first;
19}
20
21int findLast(const vector<int>& nums, int target) {
22 int low = 0, high = nums.size() - 1;
23 int last = -1;
24 while (low <= high) {
25 int mid = low + (high - low) / 2;
26 if (nums[mid] <= target) {
27 if (nums[mid] == target) last = mid;
28 low = mid + 1;
29 } else {
30 high = mid - 1;
31 }
32 }
33 return last;
34}
35
36int main() {
37 vector<int> nums = {1, 2, 4, 4, 4, 5, 6};
38 int target = 4;
39 cout << "First Position: " << findFirst(nums, target) << endl;
40 cout << "Last Position: " << findLast(nums, target) << endl;
41 return 0;
42}总结作业非常重要,请务必认真完成✔️
考试只有一次提交机会,请务必本地检查正确后再提交❇️
