周五比较放松给你写一下吧,兄弟们想投我们这边请刷我帖子
#include <bits/stdc++.h>
using namespace std;
//直接从前往后跑一遍当前数字能不能改取个最值就行,复杂度10*len(n),
int main() {
int n = 23121;
string s = std::to_string(n);
vector<int> num = {2, 4, 9};
vector<bool> flag(10, 0);
int max_num = 0;
for (auto e : num) {
flag[e] = 1;
max_num = max(max_num, e);
}
int minl = -1;
int pre_num = 0;
//特判一下前导零少位的情况
for (int i = 0; s[i]; i++) {
pre_num = pre_num * 10 + max_num;
if (pre_num < n) {
minl = max(minl, pre_num);
}
}
pre_num = 0;
for (int i = 0; s[i]; i++) {
// 换这一位
int index_num = s[i] - '0';
for (auto e : num) {
if (e < index_num) {
int ans = pre_num * 10 + e; // 后面放最大
for (int j = 1; j < s.size() - i; j++) { // 这里可以预处理个数组去掉
ans = ans * 10 + max_num;
}
minl = max(minl, ans);
}
}
pre_num = pre_num * 10 + index_num;
}
if (minl == -1) minl = -1;// 无解
cout << minl << endl;
return 0;
}