G题 | 真白的幻觉
解题思路:
暴力枚举每种数字出现的个数。由于 最大取到
,而
,因此数字位数最多为
。
示例代码:
这一部分是题目中 的代码实现。其中可以不使用
unordered_map 缓存结果,也可以使用静态数组缓存(需要额外的边界检查)。
unordered_map<int, int>ump;
int f(int x) {
if (x == 0) return 0;
if (ump.count(x)) return ump[x];
int res = 1;
while (x) {
res *= x % 10;
x /= 10;
}
u[x] = res;
return res;
}
int g(int x) {
int res = 0;
while (x != f(x)) x = f(x), ++res;
return res;
}
这一部分是使用 dfs 枚举所有可能的数量组合,将可能的答案存储在动态数组 ans 中。
int sum, mx;
int cnt[10]; // 每种数字的数量
vector<int>ans;
int build() { // 根据 cnt[] 构建数字
int num = 0;
for (int i = 9; i >= 0; --i)
for (int j = 0; j < cnt[i]; ++j)
num *= 10, num += i;
return num;
}
void dfs(int type) {
if (type == 10) { // 已经遍历完0~9
int num = build();
int res = g(num);
if (res > mx)
mx = res, ans.clear();
if (res == mx)
ans.push_back(num);
return;
}
for (int i = 0; i + sum < 18; ++i) {
cnt[type] = i;
sum += i;
dfs(type + 1);
sum -= i;
}
}
void solve() {
dfs(0);
cout << mx << endl;
for (auto&x : ans)cout << x << endl;
}

京公网安备 11010502036488号