如果使用二分法呢
时间: 2023-07-11 14:12:06 浏览: 84
二分法的使用
使用二分法需要先确定二分的上下界。上界比较好确定,就是 $R$;下界可以通过将 $L$ 的最后一位设置为 1,其他位都设置为 0 得到,即 $\lfloor (L+9)/10 \rfloor \times 10 - 1$。这样可以保证在上下界之间的价格的最后一位不是 0。
在二分的过程中,每次取中间的价格,计算其不满度。如果不满度小于等于 $k$,那么将上界缩小为当前价格;否则将下界扩大为当前价格。最后得到的上界即为满足条件的最小价格。
具体实现可以如下:
```c++
#include <iostream>
using namespace std;
int unsatisfy(int p) {
int res = 0;
while (p > 0) {
if (p % 10 == 5) {
res = 1;
} else if (p % 10 != 0) {
res = 2;
}
p /= 10;
}
return res;
}
int main() {
int L, R;
cin >> L >> R;
int left = (L + 9) / 10 * 10 - 1;
int right = R;
while (left < right) {
int mid = (left + right) / 2;
if (unsatisfy(mid) <= unsatisfy(right)) {
right = mid;
} else {
left = mid + 1;
}
}
cout << left << endl;
return 0;
}
```
时间复杂度为 $O(\log (R-L))$,比第一种方法快很多,但比第二种方法慢一些。
阅读全文