一个价格 p(p 为正整数)的不满度定义为: 首先将 p 看做一个由数字组成的字符串(不带前导 0); 然后,如果 p 的最后一个字符是 0,就去掉它。重复这一过程,直到 p 的最后一个字符不是 0; 记 p 的长度为 a,如果此时 p 的最后一位是 5,则不满度为 2a - 1;否则为 2a。 例如,150 的不满度为 3,而 180 则为 4,114514 的不满度为 12。 现在,多莉要卖出一些商品,她能接受的商品价格在 [L, R] 范围内,她希望商品不满度越小越好,请你给出一个不满度最低的价格。用C++实现
时间: 2024-02-12 15:09:36 浏览: 53
以下是一个用 C++ 实现的解法,该解法使用了深度优先搜索(DFS):
```cpp
#include <iostream>
#include <cstring>
using namespace std;
int L, R;
int ans = -1;
// 计算不满度
int calc(int p) {
string str = to_string(p);
int len = str.size();
if (str.back() == '5') {
return 2 * len - 1;
} else {
return 2 * len;
}
}
// DFS搜索
void dfs(int p, int d) {
if (p > R) return; // 剪枝
if (p >= L && (ans == -1 || d < ans)) { // 更新答案
ans = d;
}
int last = p % 10;
if (last == 0) {
dfs(p / 10, d); // 去掉末尾的0
} else {
dfs(10 * p + 5, d + 1); // 在末尾加上5
if (last != 5) {
dfs(10 * p, d + 1); // 在末尾加上0
}
}
}
int main() {
cin >> L >> R;
dfs(0, 0);
cout << ans << endl;
return 0;
}
```
这个程序首先从标准输入读取输入的范围 L 和 R,然后调用 DFS 函数进行搜索,最后输出结果。在 DFS 函数中,需要判断当前价格是否在范围内,如果不在范围内则剪枝,如果在范围内则计算不满度并更新答案。对于当前位的数字,如果是 0,则去掉它,如果不是 0,则可以在末尾加上 0 或者 5。使用一个变量来记录答案,初始值为 -1,表示还没有找到符合要求的价格。
阅读全文