周五比较放松给你写一下吧,兄弟们想投我们这边请刷我帖子 #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; }