2 条题解
-
0
自适应交互库中的 函数。该函数的核心思想是维护可能的 值范围,并通过选择能使剩余搜索空间最大的回答,确保二分查找的实际查找次数不小于理论最小值。
AC code:
#include <bits/stdc++.h> using namespace std; int respond(int n, int q, int x, vector<pair<int, int>> p) { int left = 1; int right = n; for (const auto& [u, v] : p) { if (v == 0) { left = max(left, u + 1); } else if (v == 2) { right = min(right, u - 1); } } int range0 = 0, range1 = 0, range2 = 0; if (x < right) { range0 = right - x; } if (left <= x && x <= right) { range1 = 1; } if (x > left) { range2 = x - left; } if (left == right && x == left) { return 1; } if (range0 > range2) { return 0; } else { return 2; } } -
0
很明显,每次二分查找都会将当前区间分成两段,因此我们每次只要把评测程序带到较长的那一段去二分查找就可以了。记得特判给出的二分端点不在当前区间内的情况。
#include <bits/stdc++.h> using namespace std; int respond(int n, int q, int x, vector<pair<int, int> > p) { int z = 0; int l = 0, r = n + 1; for (int i = 1; i <= q; i++) { if(p[i].second == 0) l = max(l, p[i].first); if(p[i].second == 2) r = min(r, p[i].first); } if (x - l < r - x) z = 0; if (x - l > r - x) z = 2; if (x - l == r - x && r - l != 2) z = 0; if (x - l == r - x && r - l == 2) z = 1; return z; }
- 1
信息
- ID
- 10
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 28
- 已通过
- 3
- 上传者