题目链接
题目大意
给你一个数你需要让这个数字改为另外一个大于等于当前数字的数并且使每一位上独特的数字不超过k个
题目思路
学习了该大佬的思路
从左至右走 每当出现一个未出现过的就将num++
若num>k时 就将该位置的数字++直到他成为出现过的数字
若他到9,即向前推一位继续如此计算
为保证最小性 将该位置后面每一位都置为0
对于这种数字串的题 我总是会下意识的就去想O(1)的做法
总想着逐位置特判 但是实际上很多情况用一些巧妙地暴力加贪心就可以做出来
题目代码
#include <bits/stdc++.h>
using namespace std;
string solve(){string n;int k;cin >> n >> k;map<char,int >mp;while (true){mp.clear();for (int i=0;i<n.size();i++){mp[n[i]]=1;if (mp.size() > k){while (n[i] == '9')i--;n[i]++;for (int j = i + 1; j < n.size(); j++)n[j] = '0';break;}if (mp.size() <= k&&i==n.size()-1) return n;}}
}
int main(){int t;cin >> t;while (t--)cout << solve() << '\n'; return 0;
}