如果时间复杂度更小一点呢
时间: 2023-07-25 16:13:10 浏览: 81
时间复杂度大小比较.doc
可以考虑首先通过数学方法求出最小的不满度,然后从高位到低位递推得到最小的价格。
首先,不难发现,对于一个长度为 $n$ 的价格,其不满度最小的情况是将其分成两部分,前 $n-1$ 位全为 9,最后一位为 5(如果最后一位是 0,则去掉这个 0 后不满度会更小),此时不满度为 $2n-1$。
下面考虑如何递推得到最小的价格。假设当前已经确定了前 $i$ 位,且已经确定的价格为 $p$,此时我们需要确定第 $i+1$ 位,使得不满度最小。根据上面的结论,如果 $p$ 的前 $i$ 位全为 9,那么为了使得不满度最小,第 $i+1$ 位应该为 5;否则,第 $i+1$ 位应该为 9。
因此,我们从高位到低位递推,每次判断当前位是否为 9,如果是,则直接将当前位设置为 9;否则,将当前位设置为 5,并将后面的所有位都设置为 9。
具体实现可以如下:
```c++
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int L, R;
cin >> L >> R;
int n = log10(R) + 1; // 计算价格的位数
int ans = -1;
for (int i = n - 1; i >= 0; i--) {
int digit = (R / int(pow(10, i))) % 10; // 取出第 i 位
if (digit == 9) {
if (ans == -1) {
ans = R;
}
ans -= int(pow(10, i)); // 将第 i 位设置为 9
} else {
int num = 5;
for (int j = i + 1; j < n; j++) {
num += 9 * int(pow(10, j)); // 将后面的所有位设置为 9
}
if (ans == -1) {
ans = num;
} else {
ans += num - int(pow(10, i)); // 将第 i 位设置为 5
}
break; // 因为后面的所有位都是 9,所以不用再考虑后面的位了
}
}
cout << ans << endl;
return 0;
}
```
时间复杂度为 $O(\log_{10} R)$,比前面的方法快很多。
阅读全文