消费者对于商品的价格会有一个不满度。一个价格 p(p 为正整数)的不满度定义为: 首先将 p 看做一个由数字组成的字符串(不带前导 0); 然后,如果 p 的最后一个字符是 0,就去掉它。重复这一过程,直到 p 的最后一个字符不是 0; 记 p 的长度为 a,如果此时 p 的最后一位是 5,则不满度为 2a - 1;否则为 2a。 例如,150 的不满度为 3,而 180 则为 4,114514 的不满度为 12。 现在,多莉要卖出一些商品,她能接受的商品价格在 [L, R] 范围内,她希望商品不满度越小越好,请你给出一个不满度最低的价格。1<=L<= R <=10^9.用C++实现
时间: 2024-02-13 16:01:44 浏览: 168
输入一个正整数,判断是不是素数(C++)
可以使用暴力枚举的方法来解决这个问题。对于每个价格 p 在区间 [L, R] 内,我们可以依次进行如下操作:
1. 如果 p 的最后一个字符是 0,则去掉它,重复此过程直到最后一个字符不是 0。
2. 记 p 的长度为 a,如果此时 p 的最后一位是 5,则不满度为 2a - 1;否则为 2a。
3. 记录当前找到的最小不满度以及对应的价格。
最后返回最小不满度对应的价格即可。具体实现如下:
```c++
#include <iostream>
#include <string>
using namespace std;
int calc_unsatisfy(string price) {
int len = price.size();
while (len > 0 && price[len - 1] == '0') {
len--;
price.pop_back();
}
if (len == 0) return 1; // 特判价格为 0 的情况
if (price[len - 1] == '5') return 2 * len - 1;
else return 2 * len;
}
int main() {
int L, R;
cin >> L >> R;
int min_unsatisfy = 1000000000;
int best_price = 0;
for (int p = L; p <= R; p++) {
string price = to_string(p);
int unsatisfy = calc_unsatisfy(price);
if (unsatisfy < min_unsatisfy) {
min_unsatisfy = unsatisfy;
best_price = p;
}
}
cout << best_price << endl;
return 0;
}
```
这个算法的时间复杂度是 O((R - L + 1) log R),其中最耗时的操作是将价格转换成字符串,其时间复杂度为 O(log R)。在实际应用中,该算法的效率可能不够高,需要进行优化。
阅读全文