P8481 Binary search 题解
JackMerryYoung · · 题解
前言
月赛 T2, 纯暴力可还行。
正文
第一眼我们想到的应该是贪心,每次尽可能使得区间最小,但是手模几组数据就发现是错的。可是为什么错了?
因为你前面的决策缩小长度的可能小于后面的决策缩小长度的可能,而前面的决策影响后面的决策,显然不正确。
那么再回头看看题面。看一眼数据范围发现
先抄出题人的板子,然后直接枚举
这样递归下去,当二分查找到要求的数时,结束,将递归层数取个最小值。
最终的最小值就是我们的答案了。注意第一层 DFS 的层数是
理论上是
代码
伪代码:
Func binary_search(num[], x, l, r, step):
If(l == r):
ans = min(ans, step)
Ret None
mid = (l + r) / 2;
If(num[mid] < x):
binary_search(num[], x, mid + 1, r, step + 1)
Else:
binary_search(num[], x, l, mid, step + 1)
mid = (l + r + 1) / 2;
If(num[mid] - 1 < x):
binary_search(num[], x, mid, r, step + 1)
Else:
binary_search(num[], x, l, mid - 1, step + 1)
... <- Input
For Each Query:
x = read()
ans = INF
binary_search(arr[], x, 0, N - 1, 0)
Write(ans)
后言
这种题目就先交个暴力试试,实在不行再考虑正解。